Example #1
0
        remainingVars = vars[1:]
        cuts = getCutsFromRegions(subRegions, var)
        #    print "At:", var, "remaining", remainingVars, "looping over",cuts,subRegions, var
        for c in reversed(cuts):
            #      print "Looping", c
            listRecursive(remainingVars, subRegions, requiredCuts + [c])
    else:
        assert len(subRegions) == 1, "Regions not unique!"
        r = subRegions[0]
        print ", ".join([c['name'] + ":" + str(c['cut']) for c in r['cuts']])


listRecursive()

from StopsDilepton.tools.cardFileWriter import cardFileWriter
c = cardFileWriter.cardFileWriter()
c.defWidth = 20
c.precision = 6
c.unique = False

limit = {}
signals = goodRegions[0]['sigYields'].keys()
for s in reversed(signals):
    c.reset()
    for i, r in enumerate(goodRegions):
        c.addBin('Bin' + str(i), ['bkg'], 'Bin' + str(i))
        bkg = r['bkgYield']
        sig = r['sigYields'][s]
        c.specifyObservation('Bin' + str(i), int(bkg))
        c.specifyExpectation('Bin' + str(i), 'bkg', bkg)
        c.specifyExpectation('Bin' + str(i), 'signal', sig)
Example #2
0
def wrapper(s):
    c = cardFileWriter.cardFileWriter()
    c.releaseLocation = releaseLocation71XC

    counter = 0
    c.reset()
    c.addUncertainty('PU', 'lnN')
    c.addUncertainty('topPt', 'lnN')
    c.addUncertainty('JEC', 'lnN')
    c.addUncertainty('JER', 'lnN')
    c.addUncertainty('SFb', 'lnN')
    c.addUncertainty('SFl', 'lnN')
    c.addUncertainty('SFFS', 'lnN')
    c.addUncertainty('leptonSF', 'lnN')

    eSignal = MCBasedEstimate(name=s['name'],
                              sample={channel: s
                                      for channel in allChannels},
                              cacheDir=setup.defaultCacheDir())
    cardFileName = os.path.join(setup.analysisOutputDir, setup.prefix(),
                                'cardFiles', limitPrefix, s['name'] + '.txt')
    if not os.path.exists(cardFileName) or overWrite:
        for r in regions:
            for channel in ['MuMu', 'EE', 'EMu']:
                #      for channel in ['all']:
                niceName = ' '.join([channel, r.__str__()])
                binname = 'Bin' + str(counter)
                counter += 1
                total_exp_bkg = 0
                c.addBin(binname, [e.name for e in bkgEstimators], niceName)
                for e in bkgEstimators:
                    expected = e.cachedEstimate(r, channel, setup)
                    total_exp_bkg += expected.val
                    c.specifyExpectation(binname, e.name, expected.val)

                    if expected.val > 0:

                        #PU bkg
                        c.specifyUncertainty(
                            'PU', binname, e.name,
                            1 + e.PUSystematic(r, channel, setup).val)

                        #JEC bkg
                        c.specifyUncertainty(
                            'JEC', binname, e.name,
                            1 + e.JECSystematic(r, channel, setup).val)

                        #JER bkg
                        c.specifyUncertainty(
                            'JER', binname, e.name,
                            1 + e.JERSystematic(r, channel, setup).val)

                        #topPt reweighting
                        c.specifyUncertainty(
                            'topPt', binname, e.name,
                            1 + e.topPtSystematic(r, channel, setup).val)

                        #b-tagging SF
                        c.specifyUncertainty(
                            'SFb', binname, e.name,
                            1 + e.btaggingSFbSystematic(r, channel, setup).val)
                        c.specifyUncertainty(
                            'SFl', binname, e.name,
                            1 + e.btaggingSFlSystematic(r, channel, setup).val)

                        #MC bkg stat (some condition to neglect the smaller ones?)
                        uname = 'Stat_' + binname + '_' + e.name
                        c.addUncertainty(uname, 'lnN')
                        c.specifyUncertainty('Stat_' + binname + '_' + e.name,
                                             binname, e.name,
                                             1 + expected.sigma / expected.val)

    #      assert total_exp_bkg>=0, "Total background is negative. Don't know what to do."

                c.specifyObservation(binname, int(total_exp_bkg))

                #signal
                e = eSignal
                signal = e.cachedEstimate(
                    r, channel,
                    setup.sysClone({'reweight': ['reweightLeptonFastSimSF']}))

                c.specifyExpectation(binname, 'signal', signal.val)

                if signal.val > 0:

                    #PU signal
                    c.specifyUncertainty(
                        'PU', binname, 'signal',
                        1 + e.PUSystematic(r, channel, setup).val)

                    #JEC signal
                    c.specifyUncertainty(
                        'JEC', binname, 'signal',
                        1 + e.JECSystematic(r, channel, setup).val)

                    #JER signal
                    c.specifyUncertainty(
                        'JER', binname, 'signal',
                        1 + e.JERSystematic(r, channel, setup).val)

                    #lepton FastSim SF uncertainty
                    c.specifyUncertainty(
                        'leptonSF', binname, 'signal',
                        1 + e.leptonFSSystematic(r, channel, setup).val)

                    #b-tagging SF (including FastSim SF)
                    c.specifyUncertainty(
                        'SFb', binname, 'signal',
                        1 + e.btaggingSFbSystematic(r, channel, setup).val)
                    c.specifyUncertainty(
                        'SFl', binname, 'signal',
                        1 + e.btaggingSFlSystematic(r, channel, setup).val)
                    c.specifyUncertainty(
                        'SFFS', binname, 'signal',
                        1 + e.btaggingSFFSSystematic(r, channel, setup).val)

                    #signal MC stat added in quadrature with PDF uncertainty: 10% uncorrelated
                    uname = 'Stat_' + binname + '_signal'
                    c.addUncertainty(uname, 'lnN')
                    c.specifyUncertainty(
                        uname, binname, 'signal',
                        1 + sqrt(0.1**2 + signal.sigma / signal.val))

                if signal.val <= 0.01 and total_exp_bkg <= 0.01:  # or (total_exp_bkg>300 and signal.val<0.05):
                    if verbose:
                        print "Muting bin %s. Total sig: %f, total bkg: %f" % (
                            binname, signal.val, total_exp_bkg)
                    c.muted[binname] = True
                else:
                    if verbose:
                        print "NOT Muting bin %s. Total sig: %f, total bkg: %f" % (
                            binname, signal.val, total_exp_bkg)
        #
        c.addUncertainty('Lumi', 'lnN')
        c.specifyFlatUncertainty('Lumi', 1.046)
        cardFileName = c.writeToFile(cardFileName)
    else:
        print "File %s found. Reusing." % cardFileName
    res = c.calcLimit(cardFileName)
    mStop, mNeu = s['mStop'], s['mNeu']
    try:
        if res:
            print "Result: mStop %i mNeu %i obs %5.3f exp %5.3f -1sigma %5.3f +1sigma %5.3f" % (
                mStop, mNeu, res['-1.000'], res['0.500'], res['0.160'],
                res['0.840'])
    except:
        print "Something wrong with the limit: %r" % res
    return mStop, mNeu, res
Example #3
0
def wrapper(s):
    c = cardFileWriter.cardFileWriter()
    c.releaseLocation = combineReleaseLocation

    cardFileName = os.path.join(limitDir, s.name + '.txt')
    if not os.path.exists(cardFileName) or overWrite:
        counter = 0
        c.reset()
        c.addUncertainty('PU', 'lnN')
        c.addUncertainty('topPt', 'lnN')
        c.addUncertainty('JEC', 'lnN')
        c.addUncertainty('JER', 'lnN')
        c.addUncertainty('SFb', 'lnN')
        c.addUncertainty('SFl', 'lnN')
        if fastSim:
            c.addUncertainty('SFFS', 'lnN')
            c.addUncertainty('leptonSF', 'lnN')

        eSignal = MCBasedEstimate(
            name=s.name,
            sample={channel: s
                    for channel in allChannels},
            cacheDir=setup.defaultCacheDir())
        for r in regions[1:]:
            for channel in ['MuMu', 'EE', 'EMu']:  # for channel in ['all']:
                niceName = ' '.join([channel, r.__str__()])
                binname = 'Bin' + str(counter)
                counter += 1
                total_exp_bkg = 0
                c.addBin(binname, [e.name for e in estimators], niceName)
                for e in estimators:
                    expected = e.cachedEstimate(r, channel, setup)
                    total_exp_bkg += expected.val
                    c.specifyExpectation(binname, e.name, expected.val)

                    if expected.val > 0:
                        c.specifyUncertainty(
                            'PU', binname, e.name,
                            1 + e.PUSystematic(r, channel, setup).val)
                        c.specifyUncertainty(
                            'JEC', binname, e.name,
                            1 + e.JECSystematic(r, channel, setup).val)
                        c.specifyUncertainty(
                            'JER', binname, e.name,
                            1 + e.JERSystematic(r, channel, setup).val)
                        c.specifyUncertainty(
                            'topPt', binname, e.name,
                            1 + e.topPtSystematic(r, channel, setup).val)
                        c.specifyUncertainty(
                            'SFb', binname, e.name,
                            1 + e.btaggingSFbSystematic(r, channel, setup).val)
                        c.specifyUncertainty(
                            'SFl', binname, e.name,
                            1 + e.btaggingSFlSystematic(r, channel, setup).val)

                        #MC bkg stat (some condition to neglect the smaller ones?)
                        uname = 'Stat_' + binname + '_' + e.name
                        c.addUncertainty(uname, 'lnN')
                        c.specifyUncertainty('Stat_' + binname + '_' + e.name,
                                             binname, e.name,
                                             1 + expected.sigma / expected.val)

                c.specifyObservation(binname, int(total_exp_bkg))

                #signal
                e = eSignal
                if fastSim:
                    signalSetup = setup.sysClone(
                        sys={'reweight': ['reweightLeptonFastSimSF']},
                        parameters={'useTriggers': False})
                else:
                    signalSetup = setup.sysClone(
                        parameters={'useTriggers': False})
                signal = e.cachedEstimate(r, channel, signalSetup)

                c.specifyExpectation(binname, 'signal', signal.val)

                if signal.val > 0:
                    c.specifyUncertainty(
                        'PU', binname, 'signal',
                        1 + e.PUSystematic(r, channel, signalSetup).val)
                    c.specifyUncertainty(
                        'JEC', binname, 'signal',
                        1 + e.JECSystematic(r, channel, signalSetup).val)
                    c.specifyUncertainty(
                        'JER', binname, 'signal',
                        1 + e.JERSystematic(r, channel, signalSetup).val)
                    c.specifyUncertainty(
                        'SFb', binname, 'signal', 1 +
                        e.btaggingSFbSystematic(r, channel, signalSetup).val)
                    c.specifyUncertainty(
                        'SFl', binname, 'signal', 1 +
                        e.btaggingSFlSystematic(r, channel, signalSetup).val)
                    if fastSim:
                        c.specifyUncertainty(
                            'leptonSF', binname, 'signal', 1 +
                            e.leptonFSSystematic(r, channel, signalSetup).val)
                        c.specifyUncertainty(
                            'SFFS', binname, 'signal',
                            1 + e.btaggingSFFSSystematic(
                                r, channel, signalSetup).val)

                    #signal MC stat added in quadrature with PDF uncertainty: 10% uncorrelated
                    uname = 'Stat_' + binname + '_signal'
                    c.addUncertainty(uname, 'lnN')
                    c.specifyUncertainty(
                        uname, binname, 'signal',
                        1 + sqrt(0.1**2 + signal.sigma / signal.val))

                if signal.val <= 0.01 and total_exp_bkg <= 0.01 or total_exp_bkg <= 0:  # or (total_exp_bkg>300 and signal.val<0.05):
                    if verbose:
                        print "Muting bin %s. Total sig: %f, total bkg: %f" % (
                            binname, signal.val, total_exp_bkg)
                    c.muted[binname] = True
                else:
                    if verbose:
                        print "NOT Muting bin %s. Total sig: %f, total bkg: %f" % (
                            binname, signal.val, total_exp_bkg)

        c.addUncertainty('Lumi', 'lnN')
        c.specifyFlatUncertainty('Lumi', 1.046)
        cardFileName = c.writeToFile(cardFileName)
    else:
        print "File %s found. Reusing." % cardFileName

    if args.signal == "DM": sConfig = s.mChi, s.mPhi, s.type
    elif args.signal == "T2tt": sConfig = s.mStop, s.mNeu

    if useCache and not overWrite and limitCache.contains(s):
        res = limitCache.get(sConfig)
    else:
        res = c.calcLimit(cardFileName)
        limitCache.add(sConfig, res, save=True)

    try:
        if res:
            if args.signal == "DM":
                sString = "mChi %i mPhi %i type %i" % sConfig
            elif args.signal == "T2tt":
                sString = "mStop %i mNeu %i" % sConfig
            print "Result: %i obs %5.3f exp %5.3f -1sigma %5.3f +1sigma %5.3f" % (
                sString, res['-1.000'], res['0.500'], res['0.160'],
                res['0.840'])
    except:
        print "Something wrong with the limit: %r" % res
    return sConfig, res
Example #4
0
def wrapper(s):
    c = cardFileWriter.cardFileWriter()
    c.releaseLocation = combineReleaseLocation

    cardFileName = os.path.join(limitDir, s.name + ".txt")
    if not os.path.exists(cardFileName) or overWrite:
        counter = 0
        c.reset()
        c.addUncertainty("PU", "lnN")
        c.addUncertainty("topPt", "lnN")
        c.addUncertainty("JEC", "lnN")
        c.addUncertainty("JER", "lnN")
        c.addUncertainty("SFb", "lnN")
        c.addUncertainty("SFl", "lnN")
        c.addUncertainty("SFFS", "lnN")
        c.addUncertainty("leptonSF", "lnN")

        eSignal = MCBasedEstimate(
            name=s.name, sample={channel: s for channel in allChannels}, cacheDir=setup.defaultCacheDir()
        )
        for r in regions[1:]:
            for channel in ["MuMu", "EE", "EMu"]:
                #      for channel in ['all']:
                niceName = " ".join([channel, r.__str__()])
                binname = "Bin" + str(counter)
                counter += 1
                total_exp_bkg = 0
                c.addBin(binname, [e.name for e in bkgEstimators], niceName)
                for e in bkgEstimators:
                    expected = e.cachedEstimate(r, channel, setup)
                    total_exp_bkg += expected.val
                    c.specifyExpectation(binname, e.name, expected.val)

                    if expected.val > 0:

                        # PU bkg
                        c.specifyUncertainty("PU", binname, e.name, 1 + e.PUSystematic(r, channel, setup).val)

                        # JEC bkg
                        c.specifyUncertainty("JEC", binname, e.name, 1 + e.JECSystematic(r, channel, setup).val)

                        # JER bkg
                        c.specifyUncertainty("JER", binname, e.name, 1 + e.JERSystematic(r, channel, setup).val)

                        # topPt reweighting
                        c.specifyUncertainty("topPt", binname, e.name, 1 + e.topPtSystematic(r, channel, setup).val)

                        # b-tagging SF
                        c.specifyUncertainty("SFb", binname, e.name, 1 + e.btaggingSFbSystematic(r, channel, setup).val)
                        c.specifyUncertainty("SFl", binname, e.name, 1 + e.btaggingSFlSystematic(r, channel, setup).val)

                        # MC bkg stat (some condition to neglect the smaller ones?)
                        uname = "Stat_" + binname + "_" + e.name
                        c.addUncertainty(uname, "lnN")
                        c.specifyUncertainty(
                            "Stat_" + binname + "_" + e.name, binname, e.name, 1 + expected.sigma / expected.val
                        )

                #      assert total_exp_bkg>=0, "Total background is negative. Don't know what to do."

                c.specifyObservation(binname, int(total_exp_bkg))

                # signal
                e = eSignal
                signalSetup = setup.sysClone(
                    sys={"reweight": ["reweightLeptonFastSimSF"]}, parameters={"useTriggers": False}
                )
                signal = e.cachedEstimate(r, channel, signalSetup)

                c.specifyExpectation(binname, "signal", signal.val)

                if signal.val > 0:

                    # PU signal
                    c.specifyUncertainty("PU", binname, "signal", 1 + e.PUSystematic(r, channel, signalSetup).val)

                    # JEC signal
                    c.specifyUncertainty("JEC", binname, "signal", 1 + e.JECSystematic(r, channel, signalSetup).val)

                    # JER signal
                    c.specifyUncertainty("JER", binname, "signal", 1 + e.JERSystematic(r, channel, signalSetup).val)

                    # lepton FastSim SF uncertainty
                    c.specifyUncertainty(
                        "leptonSF", binname, "signal", 1 + e.leptonFSSystematic(r, channel, signalSetup).val
                    )

                    # b-tagging SF (including FastSim SF)
                    c.specifyUncertainty(
                        "SFb", binname, "signal", 1 + e.btaggingSFbSystematic(r, channel, signalSetup).val
                    )
                    c.specifyUncertainty(
                        "SFl", binname, "signal", 1 + e.btaggingSFlSystematic(r, channel, signalSetup).val
                    )
                    c.specifyUncertainty(
                        "SFFS", binname, "signal", 1 + e.btaggingSFFSSystematic(r, channel, signalSetup).val
                    )

                    # signal MC stat added in quadrature with PDF uncertainty: 10% uncorrelated
                    uname = "Stat_" + binname + "_signal"
                    c.addUncertainty(uname, "lnN")
                    c.specifyUncertainty(uname, binname, "signal", 1 + sqrt(0.1 ** 2 + signal.sigma / signal.val))

                if (
                    signal.val <= 0.01 and total_exp_bkg <= 0.01 or total_exp_bkg <= 0
                ):  # or (total_exp_bkg>300 and signal.val<0.05):
                    if verbose:
                        print "Muting bin %s. Total sig: %f, total bkg: %f" % (binname, signal.val, total_exp_bkg)
                    c.muted[binname] = True
                else:
                    if verbose:
                        print "NOT Muting bin %s. Total sig: %f, total bkg: %f" % (binname, signal.val, total_exp_bkg)
        #
        c.addUncertainty("Lumi", "lnN")
        c.specifyFlatUncertainty("Lumi", 1.046)
        cardFileName = c.writeToFile(cardFileName)
    else:
        print "File %s found. Reusing." % cardFileName
    mStop, mNeu = s.mStop, s.mNeu
    if useCache and not overWrite and limitCache.contains((mStop, mNeu)):
        res = limitCache.get((mStop, mNeu))
    else:
        res = c.calcLimit(cardFileName)
    try:
        if res:
            print "Result: mStop %i mNeu %i obs %5.3f exp %5.3f -1sigma %5.3f +1sigma %5.3f" % (
                mStop,
                mNeu,
                res["-1.000"],
                res["0.500"],
                res["0.160"],
                res["0.840"],
            )
    except:
        print "Something wrong with the limit: %r" % res
    limitCache.add((mStop, mNeu), res, save=True)
    return mStop, mNeu, res
Example #5
0
    var = vars[0]
    remainingVars = vars[1:]
    cuts = getCutsFromRegions(subRegions, var)
#    print "At:", var, "remaining", remainingVars, "looping over",cuts,subRegions, var
    for c in reversed(cuts):
#      print "Looping", c 
      listRecursive(remainingVars,  subRegions, requiredCuts+[c])
  else:
    assert len(subRegions)==1,  "Regions not unique!"
    r = subRegions[0]
    print ", ".join([c['name']+":"+str(c['cut']) for c in r['cuts']])

listRecursive()

from StopsDilepton.tools.cardFileWriter import cardFileWriter
c = cardFileWriter.cardFileWriter()
c.defWidth=20
c.precision=6
c.unique=False

limit={}
signals = goodRegions[0]['sigYields'].keys()
for s in reversed(signals): 
  c.reset()
  for i, r in enumerate(goodRegions):
    c.addBin('Bin'+str(i), ['bkg'], 'Bin'+str(i))
    bkg = r['bkgYield']
    sig = r['sigYields'][s]
    c.specifyObservation('Bin'+str(i), int(bkg))
    c.specifyExpectation('Bin'+str(i), 'bkg', bkg)
    c.specifyExpectation('Bin'+str(i), 'signal', sig)
Example #6
0
def wrapper(s):
  c = cardFileWriter.cardFileWriter()
  c.releaseLocation = releaseLocation71XC

  counter=0
  c.reset()
  c.addUncertainty('PU', 'lnN')
  c.addUncertainty('topPt', 'lnN')
  c.addUncertainty('JEC', 'lnN')
  c.addUncertainty('JER', 'lnN')
  c.addUncertainty('SFb', 'lnN')
  c.addUncertainty('SFl', 'lnN')
  c.addUncertainty('SFFS', 'lnN')
  c.addUncertainty('leptonSF', 'lnN')

  eSignal = MCBasedEstimate(name=s['name'],    sample={channel:s for channel in allChannels}, cacheDir=setup.defaultCacheDir() )
  cardFileName = os.path.join(setup.analysisOutputDir,  setup.prefix(), 'cardFiles', limitPrefix, s['name']+'.txt')
  if not os.path.exists(cardFileName) or overWrite:
    for r in regions:
      for channel in ['MuMu', 'EE', 'EMu']:
#      for channel in ['all']:
        niceName = ' '.join([channel, r.__str__()])
        binname = 'Bin'+str(counter)
        counter += 1
        total_exp_bkg = 0
        c.addBin(binname, [e.name for e in bkgEstimators], niceName)
        for e in bkgEstimators:
          expected = e.cachedEstimate(r, channel, setup)
          total_exp_bkg += expected.val
          c.specifyExpectation(binname, e.name, expected.val )

          if expected.val>0:

            #PU bkg
            c.specifyUncertainty('PU', binname, e.name, 1 + e.PUSystematic(r, channel, setup).val )

            #JEC bkg
            c.specifyUncertainty('JEC', binname, e.name, 1 + e.JECSystematic(r, channel, setup).val )

            #JER bkg
            c.specifyUncertainty('JER', binname, e.name, 1 + e.JERSystematic(r, channel, setup).val )

            #topPt reweighting
            c.specifyUncertainty('topPt', binname, e.name, 1 + e.topPtSystematic(r, channel, setup).val )

            #b-tagging SF
            c.specifyUncertainty('SFb', binname, e.name, 1 + e.btaggingSFbSystematic(r, channel, setup).val )
            c.specifyUncertainty('SFl', binname, e.name, 1 + e.btaggingSFlSystematic(r, channel, setup).val )

            #MC bkg stat (some condition to neglect the smaller ones?)
            uname = 'Stat_'+binname+'_'+e.name
            c.addUncertainty(uname, 'lnN') 
            c.specifyUncertainty('Stat_'+binname+'_'+e.name, binname, e.name, 1+expected.sigma/expected.val )

  #      assert total_exp_bkg>=0, "Total background is negative. Don't know what to do."

        c.specifyObservation(binname, int(total_exp_bkg) )

        #signal
        e = eSignal
        signal = e.cachedEstimate(r, channel, setup.sysClone({'reweight':['reweightLeptonFastSimSF']}))

        c.specifyExpectation(binname, 'signal', signal.val )

        if signal.val>0:

          #PU signal
          c.specifyUncertainty('PU', binname, 'signal', 1 + e.PUSystematic(r, channel, setup).val )

          #JEC signal
          c.specifyUncertainty('JEC', binname, 'signal', 1 + e.JECSystematic(r, channel, setup).val )

          #JER signal
          c.specifyUncertainty('JER', binname, 'signal', 1 + e.JERSystematic(r, channel, setup).val )

          #lepton FastSim SF uncertainty
          c.specifyUncertainty('leptonSF', binname, 'signal', 1 + e.leptonFSSystematic(r, channel, setup).val )

          #b-tagging SF (including FastSim SF)
          c.specifyUncertainty('SFb', binname, 'signal', 1 + e.btaggingSFbSystematic(r, channel, setup).val )
          c.specifyUncertainty('SFl', binname, 'signal', 1 + e.btaggingSFlSystematic(r, channel, setup).val )
          c.specifyUncertainty('SFFS', binname, 'signal', 1 + e.btaggingSFFSSystematic(r, channel, setup).val )

          #signal MC stat added in quadrature with PDF uncertainty: 10% uncorrelated
          uname = 'Stat_'+binname+'_signal'
          c.addUncertainty(uname, 'lnN') 
          c.specifyUncertainty(uname, binname, 'signal', 1 + sqrt(0.1**2 + signal.sigma/signal.val) )

        if signal.val<=0.01 and total_exp_bkg<=0.01:# or (total_exp_bkg>300 and signal.val<0.05):
          if verbose: print "Muting bin %s. Total sig: %f, total bkg: %f"%(binname, signal.val, total_exp_bkg)
          c.muted[binname] = True 
        else:
          if verbose: print "NOT Muting bin %s. Total sig: %f, total bkg: %f"%(binname, signal.val, total_exp_bkg)
    #
    c.addUncertainty('Lumi', 'lnN')
    c.specifyFlatUncertainty('Lumi', 1.046)
    cardFileName = c.writeToFile(cardFileName)
  else:
    print "File %s found. Reusing."%cardFileName
  res = c.calcLimit(cardFileName)
  mStop, mNeu = s['mStop'], s['mNeu']
  try:
    if res: print "Result: mStop %i mNeu %i obs %5.3f exp %5.3f -1sigma %5.3f +1sigma %5.3f"%(mStop, mNeu, res['-1.000'], res['0.500'], res['0.160'], res['0.840'])
  except:
    print "Something wrong with the limit: %r"%res
  return mStop, mNeu, res