Source code for experiment.limitGetter

"""
.. module:: experiment.limitGetter
   :synopsis: Access the proper experimental limits to given analysis objects.

.. moduleauthor:: Andre Lessa <lessa.a.p@gmail.com>
.. moduleauthor:: Wolfgang Waltenberger <wolfgang.waltenberger@gmail.com>
.. moduleauthor:: Ursula Laa <Ursula.Laa@assoc.oeaw.ac.at>

"""

from smodels.experiment import smsInterpolation
from smodels.tools.physicsUnits import TeV, GeV, fb
import copy
import sys
import logging

logger = logging.getLogger(__name__)


[docs]def limit(analysis, addTheoryPredictions=[]): """ Get limit from an analysis object. :param addTheoryPredictions: list of theory predictions to add, e.g., [ '7 TeV (NLL)', '7 TeV (LO)' ] :type addTheoryPredictions: [String] """ sqrts = analysis.sqrts / TeV ret = [] for (constraint, _) in analysis.results.items(): if len(addTheoryPredictions) > 0: if not analysis.computeTheoryPredictions() or \ len(analysis.ResultList) == 0: continue theoRes = analysis.ResultList[0] tx = analysis.plots[constraint][0] for ana in analysis.plots[constraint][1]: for (_, element) in enumerate(analysis.Top.getElements()): for (mi, masses1) in enumerate(element.B[0].masses): masses2 = element.B[1].masses[mi] ul = smsInterpolation.upperLimit(ana, tx, masses1) tmp = {"ul": ul, "analysis": ana, "tx": tx, "m1": masses1, "m2": masses2, "sqrts": sqrts} if len(addTheoryPredictions) > 0: theory = theoRes.prediction() tmp["theory"] = theory allexcl = False for t in addTheoryPredictions: excl = ( theory[t] / fb ) > ( ul / fb ) tmp["excl_%s" % t] = excl allexcl = allexcl or excl tmp["excluded"] = allexcl ret.append(tmp) return ret
[docs]def getPlotLimit(inmass, analysis): """ Get upper limit on sigma*BR for a specific array of masses from plot. :param inmass: Array of masses in SModelS graph. :param analysis: experiment.analysis.ULanalysis. """ massArray = copy.deepcopy(inmass) # Skip empty mass arrays if len(massArray) < 2: logger.error("Length of mass-array < 2 (M: " + str(massArray) + ").") sys.exit() branchcondition = analysis.getBranchCondition() if not branchcondition or branchcondition == "equal branches": # Make sure the two branches have equal masses if massArray[0] != massArray[1]: logger.error("Masses differ between branches.") return False masslist = massArray[0] else: masslist = massArray analysis, cmsLabel = analysis.label.split(':') upperLimit = smsInterpolation.upperLimit(analysis, cmsLabel, masslist) return upperLimit