changeset 1:f70f75e89890 draft default tip

"planemo upload for repository https://github.com/ImmPortDB/immport-galaxy-tools/tree/master/flowtools/flowcl commit d59d95d2bc6a64eb5c37b8291a7c314754c2067f"
author azomics
date Thu, 23 Jul 2020 08:50:18 -0400
parents fb0ee82f686d
children
files flowcl/getOntology.R flowcl/getOntology.py flowcl/getOntology.xml flowcl/static/flowtools/css/flowCL.css flowcl/static/flowtools/js/flowcl_table.js flowcl/static/images/flowtools/flowcl_graph.png flowcl/static/images/flowtools/flowcl_summary.png flowcl/templates/flowCL.template flowcl/test-data/flowCL_res.pdf flowcl/test-data/flowCL_run_summary.txt flowcl/test-data/flowCL_table.txt flowcl/test-data/out.html getOntology.R getOntology.py getOntology.xml static/images/flowtools/flowcl_graph.png static/images/flowtools/flowcl_summary.png templates/flowCL.template test-data/flowCL_res.pdf test-data/flowCL_run_summary.txt test-data/flowCL_table.txt test-data/out.html
diffstat 22 files changed, 459 insertions(+), 532 deletions(-) [+]
line wrap: on
line diff
--- a/flowcl/getOntology.R	Mon Feb 27 12:56:34 2017 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-# Cell Ontology Module for Galaxy
-# FlowCL
-######################################################################
-#                  Copyright (c) 2016 Northrop Grumman.
-#                          All rights reserved.
-######################################################################
-# 
-# Version 1
-# Cristel Thomas
-#
-#
-
-library(flowCL)
-library(base)
-
-getOntology <- function(output_file, markers) {
-  res <- flowCL(markers, ResetArch = TRUE)
-  if (length(res) == 6) {
-    report <- capture.output(res$Table)
-    sink(output_file)
-    cat(report, sep = "\n")
-    sink()
-  }
-}
-
-args <- commandArgs(trailingOnly = TRUE)
-markers <- paste(args[3:length(args)], collapse="")
-getOntology(args[2], markers)
--- a/flowcl/getOntology.py	Mon Feb 27 12:56:34 2017 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,135 +0,0 @@
-#!/usr/bin/env python
-######################################################################
-#                  Copyright (c) 2016 Northrop Grumman.
-#                          All rights reserved.
-######################################################################
-from __future__ import print_function
-import sys
-import os
-
-from collections import defaultdict
-from argparse import ArgumentParser
-from jinja2 import Environment, FileSystemLoader
-
-
-def generate_flowCL_query(list_markers, list_types):
-    if (len(list_markers) != len(list_types)):
-        return("pb with headers")
-    query = []
-    # go through both lists, remove fsc/ssc
-    for i in range(0, len(list_markers)):
-        if not list_markers[i].startswith("FSC") and not list_markers[i].startswith("SSC"):
-            query.append(list_markers[i].upper())
-            query.append(list_types[i])
-    # return concatenated string
-    return("".join(query))
-
-
-def run_flowCL(phenotype, output_file, output_dir, tool_dir):
-    os.mkdir(output_dir)
-    tool = "/".join([tool_dir, "getOntology.R"])
-    output_txt = "".join([output_dir, "/flowCL_run_summary.txt"])
-    output_table = "".join([output_dir, "/flowCL_table.txt"])
-    output_pdf = "".join([output_dir, "/flowCL_res.pdf"])
-    run_command = " ". join(["Rscript --slave --vanilla", tool, "--args", output_txt, phenotype])
-    os.system(run_command)
-
-    table = defaultdict(list)
-    labels = []
-    nb_match = 0
-    if os.path.isfile(output_txt):
-        with open(output_txt, "r") as txt:
-            check = txt.readline().strip()
-            if (not check):
-                sys.exit(2)
-            else:
-                i = -1
-                for lines in txt:
-                    data = lines.strip("\n").split("\"")
-                    if data[0].strip():
-                        labels.append(data[0].strip())
-                        i += 1
-                        if data[0].startswith("Score"):
-                            count_matches = data[1].split(") ")
-                            nb_match = len(count_matches) - 1
-                    table[i].append(data[1])
-    else:
-        sys.stderr.write("There are no results with this query. Please check your markers if you believe there should be.")
-        sys.exit(2)
-
-    with open(output_table, "w") as tbl:
-        tbl.write("1\t2\nQuery\t" + phenotype + "\n")
-        for j in table:
-            newline = " ".join(table[j])
-            for k in range(1, nb_match + 1):
-                cur_stg = "".join([str(k+1), ")"])
-                new_stg = "".join(["<br>", cur_stg])
-                newline = newline.replace(cur_stg, new_stg)
-
-            if labels[j] == "Cell ID":
-                cls = newline.split(" ")
-                for m in range(0, len(cls)):
-                    if cls[m].startswith("CL"):
-                        cl_id = cls[m].replace("_", ":")
-                        link = "".join(['<a href="http://www.immport-labs.org/immport-ontology/public/home/home/', cl_id, '" target="_blank">'])
-                        cls[m] = "".join([link, cls[m], "</a>"])
-                newline = " ".join(cls)
-            tbl.write("\t".join([labels[j], newline]) + "\n")
-
-    get_graph = " ".join(["mv flowCL_results/*.pdf", output_pdf])
-    os.system(get_graph)
-
-    env = Environment(loader=FileSystemLoader(tool_dir + "/templates"))
-    template = env.get_template("flowCL.template")
-
-    real_directory = output_dir.replace("/job_working_directory", "")
-    context = {'outputDirectory': real_directory}
-    overview = template.render(**context)
-    with open(output_file, "w") as outf:
-        outf.write(overview)
-    return
-
-
-if __name__ == "__main__":
-    parser = ArgumentParser(
-             prog="getOntology",
-             description="runs flowCL on a set of markers.")
-
-    parser.add_argument(
-            '-m',
-            dest="markers",
-            required=True,
-            action='append',
-            help="marker queries.")
-
-    parser.add_argument(
-            '-y',
-            dest="marker_types",
-            required=True,
-            action='append',
-            help="marker queries.")
-
-    parser.add_argument(
-            '-o',
-            dest="output_file",
-            required=True,
-            help="Name of the output html file.")
-
-    parser.add_argument(
-            '-d',
-            dest="output_dir",
-            required=True,
-            help="Path to the html supporting directory")
-
-    parser.add_argument(
-            '-t',
-            dest="tool_dir",
-            required=True,
-            help="Path to the tool directory")
-
-    args = parser.parse_args()
-
-    markers = [m.strip() for m in args.markers]
-    query = generate_flowCL_query(markers, args.marker_types)
-    run_flowCL(query, args.output_file, args.output_dir, args.tool_dir)
-    sys.exit(0)
--- a/flowcl/getOntology.xml	Mon Feb 27 12:56:34 2017 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,102 +0,0 @@
-<tool id="get_cell_ontology" name="Explore cell ontology" version="1.0">
-  <description>given a phenotype using flowCL.</description>
-  <requirements>
-    <requirement type="package" version="2.8">jinja2</requirement>
-    <requirement type="package" version="3.2.3">r</requirement>
-    <requirement type="package" version="1.11.1">bioconductor-flowcl</requirement>
-  </requirements>
- <stdio>
-    <exit_code range="2" level="fatal" description="There was a problem running flowCL. You might want to check your marker names - See stderr for more details." />
-    <exit_code range="3:" level="fatal" description="See stderr for more details." />
-  </stdio>
-  <command><![CDATA[
-      python $__tool_directory__/getOntology.py -o "${html_file}" -d "${html_file.files_path}" -t $__tool_directory__ -m "${marker1}" -y "${type1}"
-      #for $mrkrs in $Markers
-        -m "${mrkrs.markername}"
-        -y "${mrkrs.markertype}"
-      #end for
-  ]]>
-  </command>
-  <inputs>
-    <param name="marker1" type="text" label="First marker"/>
-    <param name="type1" type="select" label="First marker type">
-      <option value="+">+</option>
-      <option value="-">-</option>
-      <option value="lo">lo</option>
-      <option value="lo">low</option>
-      <option value="lo">dim</option>
-      <option value="lo">--</option>
-      <option value="hi">hi</option>
-      <option value="hi">high</option>
-      <option value="hi">bri</option>
-      <option value="hi">bright</option>
-      <option value="hi">++</option>
-    </param>
-    <repeat name="Markers" title="Marker">
-      <param name="markername" type="text" label="Add marker"/>
-      <param name="markertype" type="select" label="Marker type">
-        <option value="+">+</option>
-        <option value="-">-</option>
-        <option value="lo">lo</option>
-        <option value="lo">low</option>
-        <option value="lo">dim</option>
-        <option value="lo">--</option>
-        <option value="hi">hi</option>
-        <option value="hi">high</option>
-        <option value="hi">bri</option>
-        <option value="hi">bright</option>
-        <option value="hi">++</option>
-      </param>
-    </repeat>
-  </inputs>
-  <outputs>
-    <data format="html" name="html_file" label="flowCL run"/>
-  </outputs>
-  <tests>
-    <test>
-      <param name="marker1" value="CD4"/>
-      <param name="type1" value="+"/>
-      <output name="html_file" file="out.html">
-        <extra_files type="file" name="flowCL_res.pdf" value="flowCL_res.pdf" compare="contains"/>
-        <extra_files type="file" name="flowCL_run_summary.txt" value="flowCL_run_summary.txt"/>
-        <extra_files type="file" name="flowCL_table.txt" value="flowCL_table.txt"/>
-      </output>
-    </test>
-  </tests>
- <help><![CDATA[
-   This tool uses flowCL to find the most likely match to a given set a markers.
-
------
-
-**Input**
-
-Type in the marker names and select the expression level in the drop-down menu.
-
-**Output**
-
-A summary of the ouptut of flowCL is captured in a txt file. For more details, please refer to the flowCL documentation.
-
-**Graphical output**
-
-FlowCL generates a plot for the most likely matches to ontology.
-
------
-
-**Example**
-
-*Output summary*
-
-The CL terms hyperlink to their representation in the Immport Cell Ontology browser.
-
-.. image:: static/images/flowcl_summary.png
-
-*Graphical output*
-
-.. image:: static/flowtools/flowcl_graph.png
-
-  ]]>
-  </help>
-  <citations>
-    <citation type="doi">10.1093/bioinformatics/btu807</citation>
-  </citations>
-</tool>
--- a/flowcl/static/flowtools/css/flowCL.css	Mon Feb 27 12:56:34 2017 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-/*
-** DataTables config
-*/
-div.dt-buttons {
-    float: right;
-}
-
-th {
-    font-size:16px;
-    text-align: left;
-}
-
-body td {
-    max-width: 50px;
-    font-size: 14px;
-    overflow: hidden;
-    text-overflow: ellipsis; 
-}
-
-.cltable thead {
-    display:none;
-}
-
-.cltable td {
-    max-width: 40px;
-    word-break: break-all;
-    word-wrap: break-word;
-}
-
-.firstcol {
-    width: 160px;
-}
-
-.smallcols {
-    width: 100px;
-}
-
-div.dataTables_wrapper {
-    width: 95%;
-    margin: 0 auto;
-}
-
-
--- a/flowcl/static/flowtools/js/flowcl_table.js	Mon Feb 27 12:56:34 2017 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-// Copyright (c) 2016 Northrop Grumman.
-// All rights reserved.
-
-var flowcl_table = './flowCL_table.txt';
-
-var displayFlowCLTable = function(){
-  d3.tsv(flowcl_table, function(error, data){
-    if (error){
-      alert("Problem retrieving data");
-      return;
-    }
-    var fclHTML = '<table id="flowcltable" class="cltable display compact" cellspacing="0" width="100%"/>';
-    $('#flowcl').html(fclHTML);
-
-    var fclTableData = $.extend(true, [], data);
-    var fclTable = $('#flowcltable').DataTable({
-      columns: [
-        {"data":"1", className: 'firstcol'},
-        {"data":"2"}
-      ],
-      dom: 't',
-      data: fclTableData,
-      buttons: [
-        'copy', 'pdfHtml5','csvHtml5'
-      ]
-    });
-  });
-};
Binary file flowcl/static/images/flowtools/flowcl_graph.png has changed
Binary file flowcl/static/images/flowtools/flowcl_summary.png has changed
--- a/flowcl/templates/flowCL.template	Mon Feb 27 12:56:34 2017 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head lang="en">
-<title>Flow CL Results</title>
-<meta charset="UTF-8">
-<meta HTTP-EQUIV="Pragma" CONTENT="no-cache">
-<meta name="viewport" content="width=device-width, initial-scale=1.0">
-<link rel="stylesheet" href="/static/flowtools/bootstrap/css/bootstrap.css"/>
-<link rel="stylesheet" href="/static/flowtools/select2/select2.min.css"/>
-<link rel="stylesheet" href="/static/flowtools/css/flowCL.css"/>
-<link rel="stylesheet" href="/static/flowtools/datatables/datatables.min.css"/>
-<link rel="stylesheet" href="/static/flowtools/datatables/Buttons-1.1.2/css/buttons.dataTables.min.css"/>
-<link rel="stylesheet" href="/static/flowtools/datatables/Select-1.1.2/css/select.dataTables.min.css"/>
-<script src="/static/flowtools/jquery-1.11.3.min.js" type="text/javascript"></script>
-<script src="/static/flowtools/bootstrap/js/bootstrap.js" type="text/javascript"></script>
-<script src="/static/flowtools/select2/select2.full.min.js" type="text/javascript"></script>
-<script src="/static/flowtools/d3/d3.min.js" type="text/javascript"></script>
-<script src="/static/flowtools/datatables/datatables.min.js" type="text/javascript"></script>
-<script src="/static/flowtools/js/flowcl_table.js" type="text/javascript"></script>
-
-<style>
-#input{font-family:Calibri,Arial}
-table.dataTable tbody td.dt-body-right {
-    text-align: right;
-}
-#div{padding:5px;width:150px;height:100px;text-align:center}
-table{width:100%;border:0px solid;border-collapse:collapse;text-align:left;}
-th{background-color:#3e6db0;color:#fff;padding:5px}
-</style>
-</head>
-
-<body>
-<div class="container-fluid">
-    <div class="row" style="padding-bottom:10px;min-height:500px;">
-        <div class="col-md-12">
-            <ul class="nav nav-tabs tabs-main">
-                <li class="homeTab active" data-value="flowcl"><a href="#flowcl" data-toggle="tab">FlowCL Results Summary</a></li>
-                <li class="homeTab" data-value="graph"><a href="#graph" data-toggle="tab">Graphical Representation</a></li>
-            </ul>
-
-            <div class="tab-content">
-                <div class="tab-pane active" id="flowcl" style="min-height:500px;">
-                    <div class="row">
-                        <div id="flowcl"/>
-                    </div>
-                </div>
-            </div>
-            <div class="tab-pane" id="graph" style="height:800px;">
-                <embed src="./flowCL_res.pdf" width="100%" height="100%" alt="pdf" pluginspage="http://www.adobe.com/products/acrobat/readstep2.html">
-            </div>
-        </div>
-    </div>
-</div>
-
-
-</div>
-</div>
-
-
-<script>
-var summaryLoaded = false;
-
-$().ready(function() {
-    $(document).on('shown.bs.tab','a[data-toggle="tab"]', function(e) {
-      var tab = e.target.getAttribute("href");
-      if (tab == '#flowcl') {
-        if (summaryLoaded) {
-            return true;
-        }
-        summaryLoaded = true;
-        displayFlowCLTable();
-      }
-    });
-
-    summaryLoaded = true;
-    displayFlowCLTable();
-});
-</script>
-</body>
-</html>
Binary file flowcl/test-data/flowCL_res.pdf has changed
--- a/flowcl/test-data/flowCL_run_summary.txt	Mon Feb 27 12:56:34 2017 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-                      [,1]                                                                   
-Short marker names    "CD4+"                                                                 
-Ontology marker names "CD4 molecule"                                                         
-Experiment markers    "CD4"                                                                  
-Ontology exper. names "CD4 molecule"                                                         
-Successful Match?     "No"                                                                   
-Marker ID             "1) PR_000001004 2) PR_000001004 3) PR_000001004 4) PR_000001004 5)"   
-                      "PR_000001004 + more"                                                  
-Marker Label          "1) CD4 molecule 2) CD4 molecule 3) CD4 molecule 4) CD4 molecule 5)"   
-                      "CD4 molecule + more"                                                  
-Marker Key            "1) { } CD4+ ( ) [ alpha-beta T cell receptor complex+, T cell"        
-                      "receptor co-receptor CD8+ ] 2) { } CD4+ ( ) [ alpha-beta T cell"      
-                      "receptor complex+, T cell receptor co-receptor CD8+ ] 3) { } CD4+ ( )"
-                      "[ alpha-beta T cell receptor complex+, T cell receptor co-receptor"   
-                      "CD8+ ] 4) { } CD4+ ( ) [ T-cell surface glycoprotein CD8 alpha"       
-                      "chain-, alpha-beta T cell receptor complex+ ] 5) { } CD4+ ( ) [ T"    
-                      "cell receptor co-receptor CD8-, alpha-beta T cell receptor complex+," 
-                      "CD3+ ] + more"                                                        
-Score (Out of 1)      "1) 0.333 2) 0.333 3) 0.333 4) 0.333 5) 0.25 + more"                   
-Cell ID               "1) CL_0000809 2) CL_0002427 3) CL_0002428 4) CL_0000810 5) CL_0000492"
-                      "+ more"                                                               
-Cell Label            "1) double-positive, alpha-beta thymocyte 2) resting double-positive"  
-                      "thymocyte 3) double-positive blast 4) CD4-positive, alpha-beta"       
-                      "thymocyte 5) CD4-positive helper T cell + more"                       
--- a/flowcl/test-data/flowCL_table.txt	Mon Feb 27 12:56:34 2017 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-1	2
-Short marker names	CD4+
-Ontology marker names	CD4 molecule
-Experiment markers	CD4
-Ontology exper. names	CD4 molecule
-Successful Match?	No
-Marker ID	1) PR_000001004 <br>2) PR_000001004 <br>3) PR_000001004 <br>4) PR_000001004 <br>5) PR_000001004 + more
-Marker Label	1) CD4 molecule <br>2) CD4 molecule <br>3) CD4 molecule <br>4) CD4 molecule <br>5) CD4 molecule + more
-Marker Key	1) { } CD4+ ( ) [ alpha-beta T cell receptor complex+, T cell receptor co-receptor CD8+ ] <br>2) { } CD4+ ( ) [ alpha-beta T cell receptor complex+, T cell receptor co-receptor CD8+ ] <br>3) { } CD4+ ( ) [ alpha-beta T cell receptor complex+, T cell receptor co-receptor CD8+ ] <br>4) { } CD4+ ( ) [ T-cell surface glycoprotein CD8 alpha chain-, alpha-beta T cell receptor complex+ ] <br>5) { } CD4+ ( ) [ T cell receptor co-receptor CD8-, alpha-beta T cell receptor complex+, CD3+ ] + more
-Score (Out of 1)	1) 0.333 <br>2) 0.333 <br>3) 0.333 <br>4) 0.333 <br>5) 0.25 + more
-Cell ID	1) <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0000809" target="_blank">CL_0000809</a> <br>2) <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0002427" target="_blank">CL_0002427</a> <br>3) <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0002428" target="_blank">CL_0002428</a> <br>4) <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0000810" target="_blank">CL_0000810</a> <br>5) <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0000492" target="_blank">CL_0000492</a> + more
-Cell Label	1) double-positive, alpha-beta thymocyte <br>2) resting double-positive thymocyte <br>3) double-positive blast <br>4) CD4-positive, alpha-beta thymocyte <br>5) CD4-positive helper T cell + more
--- a/flowcl/test-data/out.html	Mon Feb 27 12:56:34 2017 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head lang="en">
-<title>Flow CL Results</title>
-<meta charset="UTF-8">
-<meta HTTP-EQUIV="Pragma" CONTENT="no-cache">
-<meta name="viewport" content="width=device-width, initial-scale=1.0">
-<link rel="stylesheet" href="/static/flowtools/bootstrap/css/bootstrap.css"/>
-<link rel="stylesheet" href="/static/flowtools/select2/select2.min.css"/>
-<link rel="stylesheet" href="/static/flowtools/css/flowCL.css"/>
-<link rel="stylesheet" href="/static/flowtools/datatables/datatables.min.css"/>
-<link rel="stylesheet" href="/static/flowtools/datatables/Buttons-1.1.2/css/buttons.dataTables.min.css"/>
-<link rel="stylesheet" href="/static/flowtools/datatables/Select-1.1.2/css/select.dataTables.min.css"/>
-<script src="/static/flowtools/jquery-1.11.3.min.js" type="text/javascript"></script>
-<script src="/static/flowtools/bootstrap/js/bootstrap.js" type="text/javascript"></script>
-<script src="/static/flowtools/select2/select2.full.min.js" type="text/javascript"></script>
-<script src="/static/flowtools/d3/d3.min.js" type="text/javascript"></script>
-<script src="/static/flowtools/datatables/datatables.min.js" type="text/javascript"></script>
-<script src="/static/flowtools/js/flowcl_table.js" type="text/javascript"></script>
-
-<style>
-#input{font-family:Calibri,Arial}
-table.dataTable tbody td.dt-body-right {
-    text-align: right;
-}
-#div{padding:5px;width:150px;height:100px;text-align:center}
-table{width:100%;border:0px solid;border-collapse:collapse;text-align:left;}
-th{background-color:#3e6db0;color:#fff;padding:5px}
-</style>
-</head>
-
-<body>
-<div class="container-fluid">
-    <div class="row" style="padding-bottom:10px;min-height:500px;">
-        <div class="col-md-12">
-            <ul class="nav nav-tabs tabs-main">
-                <li class="homeTab active" data-value="flowcl"><a href="#flowcl" data-toggle="tab">FlowCL Results Summary</a></li>
-                <li class="homeTab" data-value="graph"><a href="#graph" data-toggle="tab">Graphical Representation</a></li>
-            </ul>
-
-            <div class="tab-content">
-                <div class="tab-pane active" id="flowcl" style="min-height:500px;">
-                    <div class="row">
-                        <div id="flowcl"/>
-                    </div>
-                </div>
-            </div>
-            <div class="tab-pane" id="graph" style="height:800px;">
-                <embed src="./flowCL_res.pdf" width="100%" height="100%" alt="pdf" pluginspage="http://www.adobe.com/products/acrobat/readstep2.html"> 
-            </div>
-        </div>
-    </div>
-</div>
-
-
-</div>
-</div>
-
-
-<script>
-var summaryLoaded = false;
-
-$().ready(function() {
-    $(document).on('shown.bs.tab','a[data-toggle="tab"]', function(e) {
-      var tab = e.target.getAttribute("href");
-      if (tab == '#flowcl') {
-        if (summaryLoaded) {
-            return true;
-        }
-        summaryLoaded = true;
-        displayFlowCLTable();
-      }
-    });
-
-    summaryLoaded = true;
-    displayFlowCLTable();
-});
-</script>
-</body>
-</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/getOntology.R	Thu Jul 23 08:50:18 2020 -0400
@@ -0,0 +1,29 @@
+#!/usr/bin/Rscript --vanilla
+# Cell Ontology Module for Galaxy
+# FlowCL
+######################################################################
+#                  Copyright (c) 2016 Northrop Grumman.
+#                          All rights reserved.
+######################################################################
+#
+# Version 1
+# Cristel Thomas
+#
+#
+
+suppressWarnings(suppressMessages(library(flowCL)))
+suppressWarnings(suppressMessages(library(base)))
+
+getOntology <- function(output_file, markers) {
+  res <- flowCL(markers, ResetArch = TRUE)
+  if (length(res) == 6) {
+    report <- capture.output(res$Table)
+    sink(output_file)
+    cat(report, sep = "\n")
+    sink()
+  }
+}
+
+args <- commandArgs(trailingOnly = TRUE)
+markers <- paste(args[2:length(args)], collapse="")
+getOntology(args[1], markers)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/getOntology.py	Thu Jul 23 08:50:18 2020 -0400
@@ -0,0 +1,134 @@
+#!/usr/bin/env python
+######################################################################
+#                  Copyright (c) 2016 Northrop Grumman.
+#                          All rights reserved.
+######################################################################
+from __future__ import print_function
+import sys
+import os
+
+from collections import defaultdict
+from argparse import ArgumentParser
+from jinja2 import Environment, FileSystemLoader
+
+
+def generate_flowCL_query(list_markers, list_types):
+    if (len(list_markers) != len(list_types)):
+        return("pb with headers")
+    query = []
+    # go through both lists, remove fsc/ssc
+    for i in range(0, len(list_markers)):
+        if not list_markers[i].startswith("FSC") and not list_markers[i].startswith("SSC"):
+            query.append(list_markers[i].upper())
+            query.append(list_types[i])
+    # return concatenated string
+    return("".join(query))
+
+
+def run_flowCL(phenotype, output_file, output_dir, tool_dir):
+    os.mkdir(output_dir)
+    tool = "/".join([tool_dir, "getOntology.R"])
+    output_txt = "".join([output_dir, "/flowCL_run_summary.txt"])
+    output_table = "".join([output_dir, "/flowCL_table.txt"])
+    output_pdf = "".join([output_dir, "/flowCL_res.pdf"])
+    run_command = " ". join(["Rscript --slave --vanilla", tool, output_txt, phenotype])
+    os.system(run_command)
+
+    table = defaultdict(list)
+    labels = []
+    nb_match = 0
+    if os.path.isfile(output_txt):
+        with open(output_txt, "r") as txt:
+            check = txt.readline().strip()
+            if (not check):
+                sys.exit(2)
+            else:
+                i = -1
+                for lines in txt:
+                    data = lines.strip("\n").split("\"")
+                    if data[0].strip():
+                        labels.append(data[0].strip())
+                        i += 1
+                        if data[0].startswith("Score"):
+                            count_matches = data[1].split(") ")
+                            nb_match = len(count_matches) - 1
+                    table[i].append(data[1])
+    else:
+        sys.stderr.write("There are no results with this query. Please check your markers if you believe there should be.")
+        sys.exit(2)
+
+    with open(output_table, "w") as tbl:
+        tbl.write("1\t2\nQuery\t" + phenotype + "\n")
+        for j in table:
+            newline = " ".join(table[j])
+            for k in range(1, nb_match + 1):
+                cur_stg = "".join([str(k+1), ")"])
+                new_stg = "".join(["<br>", cur_stg])
+                newline = newline.replace(cur_stg, new_stg)
+
+            if labels[j] == "Cell ID":
+                cls = newline.split(" ")
+                for m in range(0, len(cls)):
+                    if cls[m].startswith("CL"):
+                        cl_id = cls[m].replace("_", ":")
+                        link = "".join(['<a href="http://www.immport-labs.org/immport-ontology/public/home/home/', cl_id, '" target="_blank">'])
+                        cls[m] = "".join([link, cls[m], "</a>"])
+                newline = " ".join(cls)
+            tbl.write("\t".join([labels[j], newline]) + "\n")
+
+    get_graph = " ".join(["mv flowCL_results/*.pdf", output_pdf])
+    os.system(get_graph)
+
+    env = Environment(loader=FileSystemLoader(tool_dir + "/templates"))
+    template = env.get_template("flowCL.template")
+
+    real_directory = output_dir.replace("/job_working_directory", "")
+    context = {'outputDirectory': real_directory}
+    overview = template.render(**context)
+    with open(output_file, "w") as outf:
+        outf.write(overview)
+    return
+
+
+if __name__ == "__main__":
+    parser = ArgumentParser(
+             prog="getOntology",
+             description="runs flowCL on a set of markers.")
+
+    parser.add_argument(
+            '-m',
+            dest="markers",
+            required=True,
+            action='append',
+            help="marker queries.")
+
+    parser.add_argument(
+            '-y',
+            dest="marker_types",
+            required=True,
+            action='append',
+            help="marker queries.")
+
+    parser.add_argument(
+            '-o',
+            dest="output_file",
+            required=True,
+            help="Name of the output html file.")
+
+    parser.add_argument(
+            '-d',
+            dest="output_dir",
+            required=True,
+            help="Path to the html supporting directory")
+
+    parser.add_argument(
+            '-t',
+            dest="tool_dir",
+            required=True,
+            help="Path to the tool directory")
+
+    args = parser.parse_args()
+
+    markers = [m.strip() for m in args.markers]
+    query = generate_flowCL_query(markers, args.marker_types)
+    run_flowCL(query, args.output_file, args.output_dir, args.tool_dir)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/getOntology.xml	Thu Jul 23 08:50:18 2020 -0400
@@ -0,0 +1,102 @@
+<tool id="get_cell_ontology" name="Explore cell ontology" version="1.0+galaxy0" profile="18.01">
+  <description>given a phenotype using flowCL</description>
+  <requirements>
+    <requirement type="package" version="2.11.2">jinja2</requirement>
+    <requirement type="package" version="1.26.0">bioconductor-flowcl</requirement>
+  </requirements>
+  <stdio>
+    <exit_code range="1" level="fatal"/>
+    <exit_code range="2" level="fatal" description="There was a problem running flowCL. You might want to check your marker names - See stderr for more details." />
+    <exit_code range="3:" level="fatal" description="See stderr for more details." />
+  </stdio>
+  <command><![CDATA[
+      python '$__tool_directory__/getOntology.py' -o '${html_file}' -d '${html_file.files_path}' -t '$__tool_directory__' -m '${marker1}' -y '${type1}'
+      #for $mrkrs in $Markers
+        -m '${mrkrs.markername}'
+        -y '${mrkrs.markertype}'
+      #end for
+  ]]>
+  </command>
+  <inputs>
+    <param name="marker1" type="text" label="First marker"/>
+    <param name="type1" type="select" label="First marker type">
+      <option value="+">+</option>
+      <option value="-">-</option>
+      <option value="lo">lo</option>
+      <option value="lo">low</option>
+      <option value="lo">dim</option>
+      <option value="lo">--</option>
+      <option value="hi">hi</option>
+      <option value="hi">high</option>
+      <option value="hi">bri</option>
+      <option value="hi">bright</option>
+      <option value="hi">++</option>
+    </param>
+    <repeat name="Markers" title="Marker">
+      <param name="markername" type="text" label="Add marker"/>
+      <param name="markertype" type="select" label="Marker type">
+        <option value="+">+</option>
+        <option value="-">-</option>
+        <option value="lo">lo</option>
+        <option value="lo">low</option>
+        <option value="lo">dim</option>
+        <option value="lo">--</option>
+        <option value="hi">hi</option>
+        <option value="hi">high</option>
+        <option value="hi">bri</option>
+        <option value="hi">bright</option>
+        <option value="hi">++</option>
+      </param>
+    </repeat>
+  </inputs>
+  <outputs>
+    <data format="html" name="html_file" label="flowCL run"/>
+  </outputs>
+  <tests>
+    <test>
+      <param name="marker1" value="CD4"/>
+      <param name="type1" value="+"/>
+      <output name="html_file" file="out.html" compare="sim_size">
+        <extra_files type="file" name="flowCL_res.pdf" value="flowCL_res.pdf" compare="sim_size"/>
+        <extra_files type="file" name="flowCL_run_summary.txt" value="flowCL_run_summary.txt" compare="sim_size"/>
+        <extra_files type="file" name="flowCL_table.txt" value="flowCL_table.txt" compare="sim_size"/>
+      </output>
+    </test>
+  </tests>
+  <help><![CDATA[
+   This tool uses flowCL to find the most likely match to a given set a markers.
+
+-----
+
+**Input**
+
+Type in the marker names and select the expression level in the drop-down menu. Marker names need to be in the Cell Ontology for this to work.
+
+**Output**
+
+A summary of the ouptut of flowCL is captured in a txt file. For more details, please refer to the flowCL documentation.
+
+**Graphical output**
+
+FlowCL generates a plot for the most likely matches to ontology.
+
+-----
+
+**Example**
+
+*Output summary*
+
+The CL terms hyperlink to their representation in the Immport Cell Ontology browser.
+
+.. image:: ./static/images/flowtools/flowcl_summary.png
+
+*Graphical output*
+
+.. image:: ./static/images/flowtools/flowcl_graph.png
+
+  ]]>
+  </help>
+  <citations>
+    <citation type="doi">10.1093/bioinformatics/btu807</citation>
+  </citations>
+</tool>
Binary file static/images/flowtools/flowcl_graph.png has changed
Binary file static/images/flowtools/flowcl_summary.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/flowCL.template	Thu Jul 23 08:50:18 2020 -0400
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html>
+<head lang="en">
+<title>Flow CL Results</title>
+<meta charset="UTF-8">
+<meta HTTP-EQUIV="Pragma" CONTENT="no-cache">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<link rel="stylesheet" href="/static/flowtools/css/flowCL.css"/>
+<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css"/>
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.min.css"/>
+<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/v/dt/pdfmake-0.1.18/dt-1.10.12/b-1.2.1/b-colvis-1.2.1/b-html5-1.2.1/cr-1.3.2/fc-3.2.2/fh-3.1.2/r-2.1.0/rr-1.1.2/sc-1.4.2/se-1.2.0/datatables.min.css"/>
+
+<script type="text/javascript" src="https://cdn.datatables.net/v/dt/pdfmake-0.1.18/dt-1.10.12/b-1.2.1/b-colvis-1.2.1/b-html5-1.2.1/cr-1.3.2/fc-3.2.2/fh-3.1.2/r-2.1.0/rr-1.1.2/sc-1.4.2/se-1.2.0/datatables.min.js"></script>
+<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
+<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js" type="text/javascript"></script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.full.min.js" type="text/javascript"></script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js" type="text/javascript"></script>
+<script src="/static/flowtools/js/flowcl_table.js" type="text/javascript"></script>
+
+<style>
+#input{font-family:Calibri,Arial}
+table.dataTable tbody td.dt-body-right {
+    text-align: right;
+}
+#div{padding:5px;width:150px;height:100px;text-align:center}
+table{width:100%;border:0px solid;border-collapse:collapse;text-align:left;}
+th{background-color:#3e6db0;color:#fff;padding:5px}
+</style>
+</head>
+
+<body>
+<div class="container-fluid">
+    <div class="row" style="padding-bottom:10px;min-height:500px;">
+        <div class="col-md-12">
+            <ul class="nav nav-tabs tabs-main">
+                <li class="homeTab active" data-value="flowcl"><a href="#flowcl" data-toggle="tab">FlowCL Results Summary</a></li>
+                <li class="homeTab" data-value="graph"><a href="#graph" data-toggle="tab">Graphical Representation</a></li>
+            </ul>
+
+            <div class="tab-content">
+                <div class="tab-pane active" id="flowcl" style="min-height:500px;">
+                    <div class="row">
+                        <div id="flowcl"/>
+                    </div>
+                </div>
+            </div>
+            <div class="tab-pane" id="graph" style="height:800px;">
+                <embed src="./flowCL_res.pdf" width="100%" height="100%" alt="pdf" pluginspage="http://www.adobe.com/products/acrobat/readstep2.html">
+            </div>
+        </div>
+    </div>
+</div>
+
+
+</div>
+</div>
+
+
+<script>
+var summaryLoaded = false;
+
+$().ready(function() {
+    $(document).on('shown.bs.tab','a[data-toggle="tab"]', function(e) {
+      var tab = e.target.getAttribute("href");
+      if (tab == '#flowcl') {
+        if (summaryLoaded) {
+            return true;
+        }
+        summaryLoaded = true;
+        displayFlowCLTable();
+      }
+    });
+
+    summaryLoaded = true;
+    displayFlowCLTable();
+});
+</script>
+</body>
+</html>
Binary file test-data/flowCL_res.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/flowCL_run_summary.txt	Thu Jul 23 08:50:18 2020 -0400
@@ -0,0 +1,24 @@
+                      [,1]                                                                   
+Short marker names    "CD4+"                                                                 
+Ontology marker names "CD4 molecule"                                                         
+Experiment markers    "CD4"                                                                  
+Ontology exper. names "CD4 molecule"                                                         
+Successful Match?     "No"                                                                   
+Marker ID             "1) PR_000001004 2) PR_000001004 3) PR_000001004 4) PR_000001004 5)"   
+                      "PR_000001004 + more"                                                  
+Marker Label          "1) CD4 molecule 2) CD4 molecule 3) CD4 molecule 4) CD4 molecule 5)"   
+                      "CD4 molecule + more"                                                  
+Marker Key            "1) { } CD4+ ( ) [ alpha-beta T cell receptor complex+, T cell"        
+                      "receptor co-receptor CD8+ ] 2) { } CD4+ ( ) [ alpha-beta T cell"      
+                      "receptor complex+, T cell receptor co-receptor CD8+ ] 3) { } CD4+ ( )"
+                      "[ alpha-beta T cell receptor complex+, T cell receptor co-receptor"   
+                      "CD8+ ] 4) { } CD4+ ( ) [ T-cell surface glycoprotein CD8 alpha"       
+                      "chain-, alpha-beta T cell receptor complex+ ] 5) { } CD4+ ( ) [ T"    
+                      "cell receptor co-receptor CD8-, alpha-beta T cell receptor complex+," 
+                      "CD3+ ] + more"                                                        
+Score (Out of 1)      "1) 0.333 2) 0.333 3) 0.333 4) 0.333 5) 0.25 + more"                   
+Cell ID               "1) CL_0000809 2) CL_0002427 3) CL_0002428 4) CL_0000810 5) CL_0000492"
+                      "+ more"                                                               
+Cell Label            "1) double-positive, alpha-beta thymocyte 2) resting double-positive"  
+                      "thymocyte 3) double-positive blast 4) CD4-positive, alpha-beta"       
+                      "thymocyte 5) CD4-positive helper T cell + more"                       
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/flowCL_table.txt	Thu Jul 23 08:50:18 2020 -0400
@@ -0,0 +1,12 @@
+1	2
+Short marker names	CD4+
+Ontology marker names	CD4 molecule
+Experiment markers	CD4
+Ontology exper. names	CD4 molecule
+Successful Match?	No
+Marker ID	1) PR_000001004 <br>2) PR_000001004 <br>3) PR_000001004 <br>4) PR_000001004 <br>5) PR_000001004 + more
+Marker Label	1) CD4 molecule <br>2) CD4 molecule <br>3) CD4 molecule <br>4) CD4 molecule <br>5) CD4 molecule + more
+Marker Key	1) { } CD4+ ( ) [ alpha-beta T cell receptor complex+, T cell receptor co-receptor CD8+ ] <br>2) { } CD4+ ( ) [ alpha-beta T cell receptor complex+, T cell receptor co-receptor CD8+ ] <br>3) { } CD4+ ( ) [ alpha-beta T cell receptor complex+, T cell receptor co-receptor CD8+ ] <br>4) { } CD4+ ( ) [ T-cell surface glycoprotein CD8 alpha chain-, alpha-beta T cell receptor complex+ ] <br>5) { } CD4+ ( ) [ T cell receptor co-receptor CD8-, alpha-beta T cell receptor complex+, CD3+ ] + more
+Score (Out of 1)	1) 0.333 <br>2) 0.333 <br>3) 0.333 <br>4) 0.333 <br>5) 0.25 + more
+Cell ID	1) <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0000809" target="_blank">CL_0000809</a> <br>2) <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0002427" target="_blank">CL_0002427</a> <br>3) <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0002428" target="_blank">CL_0002428</a> <br>4) <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0000810" target="_blank">CL_0000810</a> <br>5) <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0000492" target="_blank">CL_0000492</a> + more
+Cell Label	1) double-positive, alpha-beta thymocyte <br>2) resting double-positive thymocyte <br>3) double-positive blast <br>4) CD4-positive, alpha-beta thymocyte <br>5) CD4-positive helper T cell + more
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/out.html	Thu Jul 23 08:50:18 2020 -0400
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html>
+<head lang="en">
+<title>Flow CL Results</title>
+<meta charset="UTF-8">
+<meta HTTP-EQUIV="Pragma" CONTENT="no-cache">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<link rel="stylesheet" href="/static/flowtools/css/flowCL.css"/>
+<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css"/>
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.min.css"/>
+<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/v/dt/pdfmake-0.1.18/dt-1.10.12/b-1.2.1/b-colvis-1.2.1/b-html5-1.2.1/cr-1.3.2/fc-3.2.2/fh-3.1.2/r-2.1.0/rr-1.1.2/sc-1.4.2/se-1.2.0/datatables.min.css"/>
+
+<script type="text/javascript" src="https://cdn.datatables.net/v/dt/pdfmake-0.1.18/dt-1.10.12/b-1.2.1/b-colvis-1.2.1/b-html5-1.2.1/cr-1.3.2/fc-3.2.2/fh-3.1.2/r-2.1.0/rr-1.1.2/sc-1.4.2/se-1.2.0/datatables.min.js"></script>
+<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
+<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js" type="text/javascript"></script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.full.min.js" type="text/javascript"></script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js" type="text/javascript"></script>
+<script src="/static/flowtools/js/flowcl_table.js" type="text/javascript"></script>
+
+<style>
+#input{font-family:Calibri,Arial}
+table.dataTable tbody td.dt-body-right {
+    text-align: right;
+}
+#div{padding:5px;width:150px;height:100px;text-align:center}
+table{width:100%;border:0px solid;border-collapse:collapse;text-align:left;}
+th{background-color:#3e6db0;color:#fff;padding:5px}
+</style>
+</head>
+
+<body>
+<div class="container-fluid">
+    <div class="row" style="padding-bottom:10px;min-height:500px;">
+        <div class="col-md-12">
+            <ul class="nav nav-tabs tabs-main">
+                <li class="homeTab active" data-value="flowcl"><a href="#flowcl" data-toggle="tab">FlowCL Results Summary</a></li>
+                <li class="homeTab" data-value="graph"><a href="#graph" data-toggle="tab">Graphical Representation</a></li>
+            </ul>
+
+            <div class="tab-content">
+                <div class="tab-pane active" id="flowcl" style="min-height:500px;">
+                    <div class="row">
+                        <div id="flowcl"/>
+                    </div>
+                </div>
+            </div>
+            <div class="tab-pane" id="graph" style="height:800px;">
+                <embed src="./flowCL_res.pdf" width="100%" height="100%" alt="pdf" pluginspage="http://www.adobe.com/products/acrobat/readstep2.html">
+            </div>
+        </div>
+    </div>
+</div>
+
+
+</div>
+</div>
+
+
+<script>
+var summaryLoaded = false;
+
+$().ready(function() {
+    $(document).on('shown.bs.tab','a[data-toggle="tab"]', function(e) {
+      var tab = e.target.getAttribute("href");
+      if (tab == '#flowcl') {
+        if (summaryLoaded) {
+            return true;
+        }
+        summaryLoaded = true;
+        displayFlowCLTable();
+      }
+    });
+
+    summaryLoaded = true;
+    displayFlowCLTable();
+});
+</script>
+</body>
+</html>