from CCP4ReportParser import *
from refmac_report import refmac_report
from xml.etree import ElementTree as ET

class molrep_pipe_report(refmac_report):
  TASKNAME = 'molrep_pipe'
  RUNNING = True
  SEPARATEDATA=True
  COLOUR = (
    ('ice blue',     '#9cb0fe', '156,176,254,255'),
    ('gold',         '#b3b13d', '179,177,61,255'),
    ('coral',        '#ff7f50', '255,127,80,255'),
    ('grey',         '#808080', '128,128,128,255'),
    ('pink',         '#ff92ff', '255,146,255,255'),
    ('sea green',    '#7fbbb5', '127,187,181,255'),
    ('pale brown',   '#a97d5e', '169,125,94,255'),
    ('lilac',        '#ae87b9', '174,135,185,255'),
    ('lemon',        '#ffff80', '255,255,128,255'),
    ('lawn green',   '#459c4f', '69,156,79,255'),
    ('pale crimson', '#d23c3e', '210,60,62,255'),
    ('light blue',   '#419ae1', '65,154,225,255'),
    ('tan',          '#780000', '120,0,0,255'),
    ('light green',  '#9aff9a', '154,255,154,255'),
    ('yellow',       '#ffff00', '255,255,0,255'),
    ('white',        '#ffffff', '255,255,255,255'),
    ('blue',         '#0000ff', '0,0,255,255'),
    ('red',          '#ff0000', '255,0,0,255'),
    ('green',        '#00ff00', '0,255,0,255'),
    ('magenta',      '#ff00ff', '255,0,255,255'),
    ('cyan',         '#00ffe1', '0,255,225,255'),
    ('purple',       '#9400ff', '148,0,255,255'),
    ('dark purple',  '#922057', '146,32,87,255'),
    ('dark cyan',    '#1095a6', '16,149,166,255'),
    ('black',        '#000000', '0,0,0,255'),
  )

  def molrep_plot_xml(self, title, nmon, yincr, label_list):
    e0 = ET.Element('plot')
    e0.text = '\n'
    e1 = ET.SubElement(e0, 'title')
    e1.text = title
    e1.tail = '\n'
    e1 = ET.SubElement(e0, 'plottype')
    e1.text = 'xy'
    e1.tail = '\n'
    for imon in range(nmon):
      e1 = ET.SubElement(e0, 'plotline')
      e1.attrib['xcol'] = str(3* imon + 1)
      e1.attrib['ycol'] = str(3* imon + yincr)
      e1.text = '\n'
      e1.tail = '\n'
      e2 = ET.SubElement(e1, 'colour')
      e2.text = self.COLOUR[imon][1]
      e2.tail = '\n'
      e2 = ET.SubElement(e1, 'label')
      e2.text = label_list[imon]
      e2.tail = '\n'

    return ET.tostring(e0)

  def molrep_report(self, parent, prefix, sgtest=False):
    label_list = list()
    nmon = 0
    while self.xmlnode.haspath(prefix + '/RFpeaks' + str(nmon) + '/RFpeak/RF'):
      nmon += 1
      label_list.append('Copy %d' %nmon)

    if sgtest:
       table = parent.addTable(select=prefix + '/laue_group_alternatives')
       for title, select in [['Space group', 'test/space_group'],
                             ['Score', 'test/score'],
                             ['Contrast', 'test/contrast'],
                             ['Selected', 'test/selected']]:
        table.addData(title=title, select=select)
        node_list = self.xmlnode.xpath(prefix + '/laue_group_alternatives/test/space_group')
        if len(node_list) == nmon:
          del label_list[:]
          for node in node_list:
            label_list.append(node.text.strip())

    title = 'Best TF peak vs RF peak No'
    style = 'width:450px;'
    graph = parent.addFlotGraph(title=title, select=prefix, style=style)
    for imon in range(nmon):
      graph.addData(title='RF_peak_No', select='RFsorted%d/RFpeak/RF' %imon)
      graph.addData(title='Score', select='RFsorted%d/RFpeak/Score' %imon)
      graph.addData(title='Tf_sig', select='RFsorted%d/RFpeak/TF_sig' %imon)

    title = 'Best TF peak score vs RF peak No'
    graph.addPlot(plot=self.molrep_plot_xml(title, nmon, 2, label_list))
    title = 'TF/sig(TF) vs RF peak No'
    graph.addPlot(plot=self.molrep_plot_xml(title, nmon, 3, label_list))

    fold = parent.addFold(label='Show details')
    for imon in range(nmon):
      fold.addText(text=label_list[imon])
      table = fold.addTable(select=prefix + "/RFpeaks%d/RFpeak" %imon)
      for title, select in [["RF", "RF"],
                            ["TF", "TF"],
                            ["Tf_sig", "TF_sig"],
                            ["TFcntrst", "TFcntrst"],
                            ["PFind", "PFind"],
                            ["PF", "PF"],
                            ["PFmin", "PFmin"],
                            ["wRfac", "wRfac"],
                            ["Score", "Score"],
                            ["Cntrst", "Cntrst"],
                            ["For", "for"]]:
        table.addData(title=title, select=select)

  def __init__(self, xmlnode=None, jobInfo={}, jobStatus=None, **kw):
    self.xmlnode = xmlnode
    Report.__init__(self, xmlnode=xmlnode, jobInfo=jobInfo, jobStatus=jobStatus, **kw)
    molrep1done = xmlnode.haspath('/MolrepPipe/MolrepSpaceGroup')
    molrep2done = xmlnode.haspath('/MolrepPipe/MolrepSearch')
    refmacdone = xmlnode.haspath('/MolrepPipe/Refmac')
    if not refmacdone:
      self.addText(text='Job is running; see subjob folders for details')

    if molrep1done or molrep2done:
      results = self.addResults()

    if molrep1done:
      molrep1 = results.addFold(label='Space group selection', initiallyOpen=not molrep2done)
      self.molrep_report(molrep1, '/MolrepPipe/MolrepSpaceGroup', True)

    if molrep2done:
      molrep2 = results.addFold(label='Structure solution', initiallyOpen=not refmacdone)
      self.molrep_report(molrep2, '/MolrepPipe/MolrepSearch')

    if refmacdone:
      self.addSummary()
      pictureFold = self.addFold(label='Picture', initiallyOpen=True)
      pictureFold.addText(text='View of the best model')
      pic = pictureFold.addPicture(label='', sceneFile="$CCP4I2/wrappers/molrep_mr/script/molrep_mr_1.scene.xml")

if __name__ == "__main__":
  import sys
  molrep_mr_report(xmlFile=sys.argv[1], jobId=sys.argv[2])

