Source code for openquake.mbi.rep.logictree

#!/usr/bin/env python
# coding: utf-8

import re

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4, A3, A2

from reportlab.lib.colors import red, black, blue, grey
from openquake.baselib import sap
from openquake.hazardlib.nrml import to_python


[docs] def get_txt(text): tmp = re.split('\\n', text) otext = [f'{tmp[0]}'] for t in tmp[1:]: otext.append(re.sub('\t','', t)) return otext
[docs] def main(fname, *, outname='report_lt.pdf'): # Settings landscape = False dfontsize = -4 delta_dx = -2 lt = to_python(fname) # This controls the vertical separation of text describing the value of # each branch row = 15 # This is width of each row col = 180 start_x = 30 start_y = 30 dx = 5 - delta_dx # This controls the height where the description of branches starts ny = 8 if landscape: c = canvas.Canvas(outname, pagesize=(A2[1], A2[0])) topy = A2[0] else: c = canvas.Canvas(outname, pagesize=(A2[0], A2[1])) topy = A2[1] # Header c.setFont("Helvetica-Bold", 14+dfontsize) tmp = f"Logic Tree ID: {lt.attrib['logicTreeID']}" c.drawString(start_x, topy-start_y, tmp) c.setFont("Helvetica", 8+dfontsize) c.setFillColor(grey) c.drawString(start_x, topy-start_y-13, f"File: {fname}") # Looping over BranchSets i = 0 tickx = 10 tickix = 2 for n, node in enumerate(lt.nodes): colx = i*col+start_x c.setFont("Helvetica", 12+dfontsize) c.setFillColor(red) c.drawString(colx, topy-(3*row+start_y), "[{:d}] BSet".format(n)) c.setFillColor(blue) c.drawString(colx+50, topy-(3*row+start_y), "{:s}".format(node.attrib['branchSetID'])) c.setFillColor(black) c.setFont("Helvetica", 10+dfontsize) c.drawString(colx, topy-(4*row+start_y), "u: {:s}".format(node.attrib['uncertaintyType'])) cnt = 1 for key in node.attrib: if re.search('^apply', key): c.drawString(colx, topy-((4+cnt)*row+start_y), "a: {:s}".format(key)) c.drawString(colx, topy-((4+cnt+1)*row+start_y), " {:s}".format(node.attrib[key])) cnt += 2 c.setFont("Helvetica", 12+dfontsize) # Looping over Branches for j, snode in enumerate(node.nodes): # Branch c.setFillColor(red) cy = topy-((ny+j*5)*row+start_y) # Branch ID c.drawString(colx, cy, "B:") c.setFillColor(blue) c.drawString(i*col+start_x+10, topy-((ny+j*5)*row+start_y), f"{snode.attrib['branchID']}") # Branch line c.setFillColor(black) p = c.beginPath() p.moveTo(colx-tickix, cy) p.lineTo(colx-tickx, cy) c.drawPath(p, fill=1) # Branch values c.setFont("Helvetica", 10+dfontsize) txts = get_txt(snode.nodes[0].text) for k, t in enumerate(txts): tdy = 0.5+0.5*k ttxt = t if k == 0 else f"v: {t}" c.drawString(i*col+start_x+dx, topy-((ny+j*5+tdy)*row+start_y), ttxt) # Branch weights tdy = 0.5*(k+2) c.drawString(i*col+start_x+dx, topy-((ny+j*5+tdy)*row+start_y), "w: {:f}".format(snode.nodes[1].text)) c.setFont("Helvetica", 12+dfontsize) if j == 0: fx = colx fy = cy p = c.beginPath() p.moveTo(colx-tickx, cy) p.lineTo(fx-tickx, fy) c.drawPath(p, fill=1) i += 1 if i > 5: c.showPage() i = 0 c.showPage() c.save() print("Generated file {:s}".format(outname))
main.fname = 'Name of the .xml file with the logic tree' main.outname = 'Name of output .pdf file' if __name__ == '__main__': sap.run(main)