Esempio n. 1
0
def writeIndexHtml(protomodel):
    """ write the index.html file, see e.g.
        https://smodels.github.io/protomodels/
    """
    ssm = []
    namer = SParticleNames(susy=False)
    frozen = protomodel.frozenParticles()
    ssms = getUnfrozenSSMs(protomodel, frozen, includeOnes=True)
    for k, v in ssms.items():
        ssm.append("%s: %.2g" % (namer.htmlName(k, addSign=True), v))
    f = open("index.html", "w")
    f.write("<html>\n")
    f.write("<body>\n")
    f.write("<center>\n")
    f.write(
        "<table><td><h1>Current best protomodel: <i>K</i>=%.2f</h1><td><img height=60px src=https://smodels.github.io/pics/banner.png></table>\n"
        % (protomodel.K))
    f.write("</center>\n")
    dbver = getDatabaseVersion(protomodel)
    strategy = "aggressive"
    dotlessv = dbver.replace(".", "")
    dt = int(time.time() - 1593000000)
    f.write ( "<b><a href=./hiscore.slha>ProtoModel</a> <a href=./pmodel.py>(dict)</a> produced with <a href=https://smodels.github.io/docs/Validation%s>database v%s</a>, combination strategy <a href=./matrix_%s.png>%s</a> in walker %d step %d.</b> " % \
            ( dotlessv, dbver, strategy, strategy, protomodel.walkerid, protomodel.step ) )
    if hasattr(protomodel, "particleContributions"):
        f.write ( "<i>K</i> plots for: <a href=./M1000022.png?%d>%s</a>" % \
                  ( dt, namer.htmlName(1000022) ) )
        for k, v in protomodel.particleContributions.items():
            f.write(", ")
            f.write("<a href=./M%d.png?%d>%s</a>" % (k, dt, namer.htmlName(k)))
        f.write(". HPD plots for: ")
        first = True
        for k, v in protomodel.particleContributions.items():
            if not first:
                f.write(", ")
            f.write("<a href=./llhd%d.png?%d>%s</a>" %
                    (k, dt, namer.htmlName(k)))
            first = False
    # fixme replace with some autodetection mechanism
    ossms = {(-1000006, 1000006), (1000021, 1000021), (-2000006, 2000006)}
    for fname in glob.glob("ssm_*_*.png"):
        pids = fname.replace("ssm_", "").replace(".png", "")
        pids = tuple(map(int, pids.split("_")))
        ossms.add(pids)
    frozen = protomodel.frozenParticles()
    # take out all frozen ssm plots
    ssms = set()
    for pids in ossms:
        hasFrozenPid = False
        for pid in pids:
            if pid in frozen or -pid in frozen:
                hasFrozenPid = True
                break
        if not hasFrozenPid:
            ssms.add(pids)

    f.write(". SSM plots for: ")
    first = True
    for pids in ssms:
        if not first:
            f.write(", ")
        f.write ( "<a href=./ssm_%d_%d.png?%d>(%s,%s)</a>" % \
                  ( pids[0],pids[1], dt, namer.htmlName(pids[0],addSign=True),
                    namer.htmlName(pids[1],addSign=True) ) )
        first = False
    f.write("<br>\n")
    f.write("<table width=80%>\n<tr><td>\n")
    if hasattr(protomodel, "tpList"):
        rvalues = protomodel.tpList
        rvalues.sort(key=lambda x: x[0], reverse=True)
        f.write(
            "<br><b>%d predictions available. Highest r values are:</b><br><ul>\n"
            % len(rvalues))
        for rv in rvalues[:5]:
            srv = "N/A"
            if type(rv[1]) in [float, numpy.float64, numpy.float32]:
                srv = "%.2f" % rv[1]
            elif type(rv[1]) != type(None):
                srv = str(rv[1])
            f.write("<li>%s:%s r=%.2f, r<sub>exp</sub>=%s<br>\n" %
                    (anaNameAndUrl(rv[2]), ",".join(map(
                        str, rv[2].txnames)), rv[0], srv))
        f.write("</ul>\n")
    else:
        print("[plotHiscore] protomodel has no r values!")

    if hasattr(protomodel, "analysisContributions"):
        print("[plotHiscore] contributions-per-analysis are defined")
        f.write(
            "<td><br><b>K values without analyses: (contribution)</b><br>\n<ul>\n"
        )
        conts = []
        Ktot = protomodel.K
        dKtot = 0.
        contributions = protomodel.analysisContributions
        for k, v in contributions.items():
            conts.append((v, k))
            dKtot += Ktot - v
        conts.sort(reverse=True)
        for v, k in conts:
            Kwithout = contributions[k]
            cont = (Ktot - Kwithout) / dKtot
            nameAndUrl = anaNameAndUrl(k, protomodel=protomodel)
            kv = str(v)
            if type(v) in [float, numpy.float64]:
                kv = "%.2f (%d%s)" % (v, int(round(100. * cont)), "%")
            f.write("<li> %s: %s\n" % (nameAndUrl, kv))
        # f.write ( "</table>\n" )
    else:
        print("[plotHiscore] analysis-contributions are not defined")

    height = 32 * int((len(ssm) + 3) / 4)
    if ssm == []:
        height = 32
    if hasattr(protomodel, "particleContributions"):
        height += 32
    t0 = int(time.time())
    f.write("<td><img width=600px src=./texdoc.png?%d>\n" % (t0))
    f.write("<br><font size=-1>Last updated: %s</font>\n" % time.asctime())
    f.write("</table>")
    f.write('<table style="width:80%">\n')
    f.write("<td width=45%>")
    f.write("<img height=580px src=./ruler.png?%d>" % (t0))
    f.write("<td width=55%>")
    f.write("<img height=380px src=./decays.png?%d>\n" % (t0))
    f.write(
        '<font size=-3><iframe type="text/html" height="220px" width="100%s" frameborder="0" src="./rawnumbers.html?%d"></iframe></font>\n'
        % ("%s", t0))
    f.write("</table>\n")
    # f.write ( "<br><font size=-1>Last updated: %s</font>\n" % time.asctime() )
    f.write("</body>\n")
    f.write("</html>\n")
    f.close()
    print("[plotHiscore] Wrote index.html")
Esempio n. 2
0
def writeRawNumbersHtml(protomodel):
    """ write out the raw numbers of the excess, as html """
    f = open("rawnumbers.html", "wt")
    f.write("<table>\n")
    f.write(
        "<tr><th>Analysis Name</th><th>Type</th><th>Dataset</th><th>Topos</th><th>Observed</th><th>Expected</th><th>Approx &sigma;</th><th>Particles</th>"
    )
    didordidnot, hassigs = hasSignals(protomodel)
    print(
        f"[plotHiscore] protomodel's database {didordidnot} have fake signals."
    )
    if hassigs:
        f.write("<th>Signal</th>")
    f.write("\n</tr>\n")
    namer = SParticleNames(susy=False)
    for tp in protomodel.bestCombo:
        anaId = tp.analysisId()
        idAndUrl = anaNameAndUrl(tp)
        dtype = tp.dataType()
        ltopos = list(map(str, tp.txnames))
        ltopos.sort()
        topos = ", ".join(ltopos)
        S = "?"
        dt = {"upperLimit": "ul", "efficiencyMap": "em"}
        f.write("<tr><td>%s</td><td>%s</td> " % (idAndUrl, dt[dtype]))
        #f.write ( "<tr><td>%s</td><td>%s</td> " % ( anaId, dt[dtype] ) )
        if dtype == "efficiencyMap":
            dI = tp.dataset.dataInfo
            did = dI.dataId  # .replace("_","\_")
            maxLen = 9
            maxLen = 18
            if len(did) > maxLen:
                did = did[:maxLen - 3] + " ..."
            eBG = dI.expectedBG
            if eBG == int(eBG):
                eBG = int(eBG)
            bgErr = dI.bgError
            if bgErr == int(bgErr):
                bgErr = int(bgErr)
            toterr = math.sqrt(bgErr**2 + eBG)
            if toterr > 0.:
                S = "%.1f &sigma;" % ((dI.observedN - eBG) / toterr)
            pids = set()
            for prod in tp.PIDs:
                for branch in prod:
                    for pid in branch:
                        if type(pid) == int and abs(pid) != 1000022:
                            pids.add(abs(pid))
                        if type(pid) in [list, tuple
                                         ] and abs(pid[0]) != 1000022:
                            pids.add(abs(pid[0]))
            obsN = dI.observedN
            if (obsN - int(obsN)) < 1e-6:
                obsN = int(obsN)
            particles = namer.htmlName(pids, addSign=False, addBrackets=False)
            sobsN = str(obsN)
            if type(obsN) == float:
                sobsN = "%.2f" % obsN
            f.write ( '<td>%s</td><td>%s</td><td>%s</td><td>%s +/- %s</td><td style="text-align:right">%s</td><td style="text-align:right">%s</td>' % \
                      ( did, topos, sobsN, eBG, bgErr, S, particles ) )
            if hassigs:
                sig = "-"
                if hasattr(dI, "sigN"):
                    sig = "%s" % dI.sigN
                    if type(dI.sigN) in [float]:
                        sig = "%.2f" % dI.sigN
                f.write('<td style="text-align:right">%s</td>' % sig)
        if dtype == "upperLimit":
            S = "?"
            llhd, chi2 = tp.likelihoodFromLimits(expected=False, chi2also=True)
            eUL = tp.expectedUL.asNumber(fb)
            oUL = tp.upperLimit.asNumber(fb)
            sigma_exp = eUL / 1.96  # the expected scale, sigma
            Z = (oUL - eUL) / sigma_exp
            # Z = math.sqrt ( chi2 )
            S = "%.1f &sigma;" % Z
            # S = "%.2g l" % llhd
            # print ( "llhd,chi2,Z", llhd,chi2,Z )
            # p = 1. - scipy.stats.chi2.cdf ( chi2, df=1 )
            pids = set()
            for prod in tp.PIDs:
                for branch in prod:
                    for pid in branch:
                        if type(pid) == int and abs(pid) != 1000022:
                            pids.add(abs(pid))
                        if type(pid) in [list, tuple
                                         ] and abs(pid[0]) != 1000022:
                            pids.add(abs(pid[0]))
            #particles = helpers.toHtml ( pids, addSign = False,
            #                              addBrackets = False )
            particles = namer.htmlName(pids, addSign=False, addBrackets=False)
            f.write ( '<td>-</td><td>%s</td><td> %.1f fb </td><td> %.1f fb</td><td style="text-align:right">%s</td><td style="text-align:right">%s</td>' % \
                    ( topos, tp.upperLimit.asNumber(fb), tp.expectedUL.asNumber(fb),
                      S, particles ) )
            if hassigs:
                sig = "-"
                for txn in tp.txnames:
                    # for txn in tp.dataset.txnameList:
                    if hasattr(txn, "sigmaN"):
                        sig = "%.2f fb" % txn.sigmaN
                f.write('<td style="text-align:right">%s</td>' % sig)
        f.write('</tr>\n')
    f.write("</table>\n")
    f.close()