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")
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 σ</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 σ" % ((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 σ" % 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()