From cf9d73c8ad0fe06c04760f91edaf23270d0e78a4 Mon Sep 17 00:00:00 2001 From: buczekp <buczekp> Date: Wed, 9 Mar 2011 14:06:57 +0000 Subject: [PATCH] [LMS-1979] first version of the script for plasmid parents property SVN: 20268 --- .../jython-scripts/MP-plasmid_parents.py | 145 ++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 plasmid/resource/jython-scripts/MP-plasmid_parents.py diff --git a/plasmid/resource/jython-scripts/MP-plasmid_parents.py b/plasmid/resource/jython-scripts/MP-plasmid_parents.py new file mode 100644 index 00000000000..c100ebe57e2 --- /dev/null +++ b/plasmid/resource/jython-scripts/MP-plasmid_parents.py @@ -0,0 +1,145 @@ +import sys +import re + +"""debug sys path""" +#print(sys.path) + +''' +FRP1 (DEL:URA3), FRP2 (INT), FRP3 (MOD:URA3), FRP4 + +Relationship types: + + * DEL: deletion + * INT: integration + * MOD: modification +''' + +""""space that all parents come from (fixed)""" +SPACE = "YEAST_LAB" + +INPUT_PATTERN = """ + # no '^': allow whitespace at the beginning + ([^ (]*) # 1st group: match code of a sample, everything before a space or '(' (e.g. 'FRP') + (\ *\( # start of 2nd group (matches an optional relationship type with annotation) + # any spaces followed by a '(' + ([^:]*) # 3rd group: match relationship type, any character but ':' (e.g. 'DEL', 'INT', 'MOD') + :? # optional ':' separator + (.*) # 4th group: match annotation, any text (e.g. 'URA3') + \))? # end of 2nd (optional) group: closing bracket of relationship details + # no '$': allow whitespace at the end +""" + +def group(pattern, input): + return pattern.search(input).groups() + +EXAMPLES = [ + 'FRP1 (DEL:URA3)', + 'FRP2 (INT)', + 'FRP3 (MOD:URA3)', + 'FRP4', + 'FRPS5' +] + +REL_TYPES = ('DEL', 'INT', 'MOD') +REL_TYPE_CHARS = { + 'DEL': 'd', + 'INT': '::', + 'MOD': '_' +} +REL_TYPE_LABELS = { + 'DEL': 'deletion', + 'INT': 'integration', + 'MOD': 'modification' +} + +ATR_CODE = "code" +ATR_RELATIONSHIP = "rel" +ATR_ANNOTATION = "annotation" + +"""helper functions""" + +def translateToChar(relationship): + if relationship in REL_TYPE_CHARS: + return REL_TYPE_CHARS[relationship] + else: + return "[" + relationship + "]" + +def createConnectionString(code, relationship, annotation): + result = code + if relationship: + result += translateToChar(relationship) + if annotation: + result += annotation + return result + +def createSampleLink(code, relationship, annotation): + permId = entityInformationProvider().getSamplePermId(SPACE, code) + if not permId: + permId = code + sampleLink = elementFactory().createSampleLink(permId) + sampleLink.addAttribute(ATR_CODE, code) + if relationship: + sampleLink.addAttribute(ATR_RELATIONSHIP, relationship) + if relationship in REL_TYPES: + connectionString = createConnectionString(code, relationship, annotation) + else: + raise ValidationException("Unknown relationship: '" + relationship + + "'. Expected one of: " + REL_TYPES) + if annotation: + sampleLink.addAttribute(ATR_ANNOTATION, annotation) + return sampleLink + +"""main functions""" + +""" updateFromBatchInput """ + +def updateFromBatchInput(bindings): + inputPattern = re.compile(INPUT_PATTERN, re.VERBOSE) + input = bindings.get('') + plasmids = input.split(',') + elements = [] + for p in plasmids: + (code, g, relationship, annotation) = group(inputPattern, p.strip()) + sampleLink = createSampleLink(code, relationship, annotation) + elements.append(sampleLink) + property.value = propertyConverter().convertToString(elements) + +""" configureUI """ + +CONNECTION_LABEL = "connection" +LINK_LABEL = "link" +CODE_LABEL = "code" +RELATIONSHIP_LABEL = "relationship" +ANNOTATION_LABEL = "annotation" + +def configureUI(): + inputPattern = re.compile(INPUT_PATTERN, re.VERBOSE) + + """create table builder and add columns""" + tableBuilder = createTableBuilder() + tableBuilder.addHeader(CONNECTION_LABEL) + tableBuilder.addHeader(LINK_LABEL) + tableBuilder.addHeader(CODE_LABEL) + tableBuilder.addHeader(RELATIONSHIP_LABEL) + tableBuilder.addHeader(ANNOTATION_LABEL) + + """The property value should contain XML with list of sample. Add a new row for every sample.""" + elements = list(propertyConverter().convertToElements(property)) + for plasmid in elements: + permId = plasmid.getPermId() + code = plasmid.getAttribute(ATR_CODE, "") + relationship = plasmid.getAttribute(ATR_RELATIONSHIP, "") + code = plasmid.getAttribute(ATR_CODE, "") + annotation = plasmid.getAttribute(ATR_ANNOTATION, "") + + row = tableBuilder.addRow() + row.setCell(CONNECTION_LABEL, createConnectionString(code, relationship, annotation)) + row.setCell(LINK_LABEL, plasmid) + row.setCell(CODE_LABEL, code) + row.setCell(RELATIONSHIP_LABEL, relationship) + row.setCell(ANNOTATION_LABEL, annotation) + + """specify that the property should be shown in a tab and set the table output""" + property.setOwnTab(True) + uiDesc = property.getUiDescription() + uiDesc.useTableOutput(tableBuilder.getTableModel()) \ No newline at end of file -- GitLab