Mercurial > repos > fubar > plotly_blast_plot
comparison plotly_blast_tool/plotlyblast.xml @ 1:6fbd48e9c950 draft
ready for beta testing?
| author | fubar |
|---|---|
| date | Wed, 26 Jul 2023 06:35:18 +0000 |
| parents | 61cc57e069c0 |
| children | 47a7eeec4a19 |
comparison
equal
deleted
inserted
replaced
| 0:61cc57e069c0 | 1:6fbd48e9c950 |
|---|---|
| 1 <tool name="plotlyblast" id="plotlyblast" version="3.0"> | 1 <tool name="plotlyblast" id="plotlyblast" version="3.0"> |
| 2 <!--Source in git at: https://github.com/fubar2/galaxy--> | 2 <!--Source in git at: https://github.com/fubar2/galaxy_tf_overlay--> |
| 3 <!--Created by toolfactory@galaxy.org at 25/07/2023 14:13:15 using the Galaxy Tool Factory.--> | 3 <!--Created by toolfactory@galaxy.org at 26/07/2023 15:45:12 using the Galaxy Tool Factory.--> |
| 4 <description>Plotly plot generator</description> | 4 <description>Plotly plot generator</description> |
| 5 <requirements> | 5 <requirements> |
| 6 <requirement type="package" version="1.5.3">pandas</requirement> | 6 <requirement type="package">pandas</requirement> |
| 7 <requirement type="package" version="5.9.0">plotly</requirement> | 7 <requirement type="package">plotly</requirement> |
| 8 </requirements> | 8 </requirements> |
| 9 <stdio> | 9 <stdio> |
| 10 <exit_code range="1:" level="fatal"/> | 10 <exit_code range="1:" level="fatal"/> |
| 11 </stdio> | 11 </stdio> |
| 12 <version_command><![CDATA[echo "3.0"]]></version_command> | 12 <version_command><![CDATA[echo "3.0"]]></version_command> |
| 50 a('--hovercol',default='qseq') | 50 a('--hovercol',default='qseq') |
| 51 a('--title',default='test blast plot of mismatch by bitscore coloured by qaccver ') | 51 a('--title',default='test blast plot of mismatch by bitscore coloured by qaccver ') |
| 52 args = parser.parse_args() | 52 args = parser.parse_args() |
| 53 df = pd.read_csv(args.input_tab, sep='\t') | 53 df = pd.read_csv(args.input_tab, sep='\t') |
| 54 NCOLS = df.columns.size | 54 NCOLS = df.columns.size |
| 55 MAXLEN = 40 # tricky way to truncate long axis tickmarks | 55 MAXLEN = 30 # tricky way to truncate long axis tickmarks |
| 56 defaultcols = ['col%d' % (x+1) for x in range(NCOLS)] | 56 defaultcols = ['col%d' % (x+1) for x in range(NCOLS)] |
| 57 if len(args.header.strip()) > 0: | 57 if len(args.header.strip()) > 0: |
| 58 newcols = args.header.split(',') | 58 newcols = args.header.split(',') |
| 59 if len(newcols) == NCOLS: | 59 if len(newcols) == NCOLS: |
| 60 df.columns = newcols | 60 df.columns = newcols |
| 61 else: | 61 else: |
| 62 sys.stderr.write('#### Supplied header %s has %d comma delimited header names - does not match the input tabular file %d columns - using col1,...coln' % (args.header, len(newcols), NCOLS)) | 62 sys.stderr.write('#### Supplied header %s has %d comma delimited header names - does not match the input tabular file %d columns - using col1,...coln' % (args.header, len(newcols), NCOLS)) |
| 63 df.columns = defaultcols | 63 df.columns = defaultcols |
| 64 else: | 64 else: |
| 65 df.columns = defaultcols | 65 df.columns = defaultcols |
| 66 df['evalue'] = [-math.log(x) for x in df['evalue']] # convert so large values reflect statistical surprise | 66 df['evalue'] = [-math.log(x + 1e-308) for x in df['evalue']] # convert so large values reflect statistical surprise |
| 67 if len(args.colourcol.strip()) == 0: | 67 if len(args.colourcol.strip()) == 0: |
| 68 fig = px.scatter(df, x=args.xcol, y=args.ycol, hover_name=args.hovercol) | 68 fig = px.scatter(df, x=args.xcol, y=args.ycol, hover_name=args.hovercol) |
| 69 else: | 69 else: |
| 70 fig = px.scatter(df, x=args.xcol, y=args.ycol, color=args.colourcol, hover_name=args.hovercol) | 70 fig = px.scatter(df, x=args.xcol, y=args.ycol, color=args.colourcol, hover_name=args.hovercol) |
| 71 if args.title: | 71 if args.title: |
| 72 ftitle=dict(text=args.title, font=dict(size=50)) | 72 ftitle=dict(text=args.title, font=dict(size=40), automargin=True) |
| 73 fig.update_layout(title=ftitle) | 73 fig.update_layout(title=ftitle) |
| 74 for scatter in fig.data: | 74 for scatter in fig.data: |
| 75 scatter['x'] = [str(x)[:MAXLEN] + '..' if len(str(x)) > MAXLEN else x for x in scatter['x']] | 75 scatter['x'] = [str(x)[:MAXLEN] + '..' if len(str(x)) > MAXLEN else x for x in scatter['x']] |
| 76 scatter['y'] = [str(x)[:MAXLEN] + '..' if len(str(x)) > MAXLEN else x for x in scatter['y']] | 76 scatter['y'] = [str(x)[:MAXLEN] + '..' if len(str(x)) > MAXLEN else x for x in scatter['y']] |
| 77 if len(args.colourcol.strip()) == 0: | |
| 78 sl = str(scatter['legendgroup']) | |
| 79 if len(sl) > MAXLEN: | |
| 80 scatter['legendgroup'] = sl[:MAXLEN] | |
| 77 fig.write_html(args.htmlout) | 81 fig.write_html(args.htmlout) |
| 82 | |
| 78 | 83 |
| 79 #end raw]]></configfile> | 84 #end raw]]></configfile> |
| 80 </configfiles> | 85 </configfiles> |
| 81 <inputs> | 86 <inputs> |
| 82 <param name="input_tab" type="data" optional="false" label="Tabular input file to plot" help="" format="tabular" multiple="false"/> | 87 <param name="input_tab" type="data" optional="false" label="Tabular input file to plot" help="" format="tabular" multiple="false"/> |
| 83 <param name="xcol" type="text" value="mismatch" label="x axis for plat" help=""/> | 88 <param name="xcol" type="text" value="qaccver" label="x axis for plat" help=""/> |
| 84 <param name="ycol" type="text" value="bitscore" label="y axis for plot" help=""/> | 89 <param name="ycol" type="text" value="bitscore" label="y axis for plot" help=""/> |
| 85 <param name="colourcol" type="text" value="qaccver" label="column containing a groupable variable for colour. Default none." help="Adds a legend so choose wisely "/> | 90 <param name="colourcol" type="text" value="piden" label="column containing a groupable variable for colour. Default none." help="Adds a legend so choose wisely "/> |
| 86 <param name="hovercol" type="text" value="qseq" label="columname for hover string" help=""/> | 91 <param name="hovercol" type="text" value="qseq" label="columname for hover string" help=""/> |
| 87 <param name="title" type="text" value="Test title default" label="Title for the plot" help=""/> | 92 <param name="title" type="text" value="Qaccver by bitscore coloured by pident. Hover shows blast match." label="Title for the plot" help="Special characters will probably be escaped so do not use them"/> |
| 88 <param name="header" type="text" value="qaccver,saccver,piden,length,mismatch,gapopen,qstart,qend,sstart,send,evalue,bitscore,sallseqid,score,nident,positive,gaps,ppos,qframe,sframe,qseq,sseq,qlen,slen,salltitles" label="Use this comma delimited list of column header names for this tabular file__sq__s columns" help="Default for Galaxy blast outputs with 25 columns."/> | 93 <param name="header" type="text" value="qaccver,saccver,piden,length,mismatch,gapopen,qstart,qend,sstart,send,evalue,bitscore,sallseqid,score,nident,positive,gaps,ppos,qframe,sframe,qseq,sseq,qlen,slen,salltitles" label="Use this comma delimited list of column header names for this tabular file. Default is None when col1...coln will be used" help="Default for Galaxy blast outputs with 25 columns. The column names supplied for xcol, ycol, hover and colour MUST match either the supplied list, or if none, col1...coln."/> |
| 89 </inputs> | 94 </inputs> |
| 90 <outputs> | 95 <outputs> |
| 91 <data name="htmlout" format="html" label="htmlout" hidden="false"/> | 96 <data name="htmlout" format="html" label="htmlout" hidden="false"/> |
| 92 </outputs> | 97 </outputs> |
| 93 <tests> | 98 <tests> |
| 94 <test> | 99 <test> |
| 95 <output name="htmlout" value="htmlout_sample" compare="sim_size" delta="5000"/> | 100 <output name="htmlout" value="htmlout_sample" compare="sim_size" delta="5000"/> |
| 96 <param name="input_tab" value="input_tab_sample"/> | 101 <param name="input_tab" value="input_tab_sample"/> |
| 97 <param name="xcol" value="mismatch"/> | 102 <param name="xcol" value="qaccver"/> |
| 98 <param name="ycol" value="bitscore"/> | 103 <param name="ycol" value="bitscore"/> |
| 99 <param name="colourcol" value="qaccver"/> | 104 <param name="colourcol" value="piden"/> |
| 100 <param name="hovercol" value="qseq"/> | 105 <param name="hovercol" value="qseq"/> |
| 101 <param name="title" value="Test title default"/> | 106 <param name="title" value="Qaccver by bitscore coloured by pident. Hover shows blast match."/> |
| 102 <param name="header" value="qaccver,saccver,piden,length,mismatch,gapopen,qstart,qend,sstart,send,evalue,bitscore,sallseqid,score,nident,positive,gaps,ppos,qframe,sframe,qseq,sseq,qlen,slen,salltitles"/> | 107 <param name="header" value="qaccver,saccver,piden,length,mismatch,gapopen,qstart,qend,sstart,send,evalue,bitscore,sallseqid,score,nident,positive,gaps,ppos,qframe,sframe,qseq,sseq,qlen,slen,salltitles"/> |
| 103 </test> | 108 </test> |
| 104 </tests> | 109 </tests> |
| 105 <help><![CDATA[ | 110 <help><![CDATA[ |
| 106 | 111 |
| 108 | 113 |
| 109 | 114 |
| 110 | 115 |
| 111 .. class:: warningmark | 116 .. class:: warningmark |
| 112 | 117 |
| 113 | 118 NOTE: Long strings in x and y tickmarks WILL BE TRUNCATED if they are too long - ".." is added to indicate truncation - otherwise some plots are squished. |
| 114 | 119 |
| 115 Long strings in x and y tickmarks WILL BE TRUNCATED if they are too long - ".." is added to indicate truncation - otherwise some plots are squished. | 120 |
| 116 | 121 |
| 117 The evalues WILL BE CONVERTED as -log10(evalue) so they are scaled in a way that doesn't confuse plotly.express with the tiny values. | 122 .. class:: warningmark |
| 123 | |
| 124 NOTE: Blast evalues WILL BE TRANSFORMED using -log10(evalue), so they are scaled in a way that doesn't confuse plotly.express with the tiny values. | |
| 118 | 125 |
| 119 | 126 |
| 120 | 127 |
| 121 ---- | 128 ---- |
| 122 | 129 |
| 123 | 130 |
| 124 | 131 |
| 125 The main reason to run this tool is to have an interactive hover text specified so it appears when hovering over each data point to supply useful information. | 132 The main reason to run this tool is to have an interactive hover text specified so it appears when hovering over each data point to supply useful information. |
| 126 | 133 |
| 127 | 134 |
| 128 | 135 |
| 129 Assumes you want a hover display for an interactive plot to be informative | 136 Assumes you want a hover display for an interactive plot to be informative |
| 130 | 137 |
| 147 | 154 |
| 148 | 155 |
| 149 Relies on Plotly python code released under the MIT licence: https://github.com/plotly/plotly.py/blob/master/LICENSE.txt | 156 Relies on Plotly python code released under the MIT licence: https://github.com/plotly/plotly.py/blob/master/LICENSE.txt |
| 150 | 157 |
| 151 | 158 |
| 159 | |
| 160 .. image:: pbsample.png | |
| 161 | |
| 162 :height: 400 | |
| 163 | |
| 164 :width: 400 | |
| 165 | |
| 166 | |
| 152 | 167 |
| 153 ------ | 168 ------ |
| 154 | 169 |
| 155 | 170 |
| 156 Script:: | 171 Script:: |
| 174 a('--hovercol',default='qseq') | 189 a('--hovercol',default='qseq') |
| 175 a('--title',default='test blast plot of mismatch by bitscore coloured by qaccver ') | 190 a('--title',default='test blast plot of mismatch by bitscore coloured by qaccver ') |
| 176 args = parser.parse_args() | 191 args = parser.parse_args() |
| 177 df = pd.read_csv(args.input_tab, sep='\t') | 192 df = pd.read_csv(args.input_tab, sep='\t') |
| 178 NCOLS = df.columns.size | 193 NCOLS = df.columns.size |
| 179 MAXLEN = 40 # tricky way to truncate long axis tickmarks | 194 MAXLEN = 30 # tricky way to truncate long axis tickmarks |
| 180 defaultcols = ['col%d' % (x+1) for x in range(NCOLS)] | 195 defaultcols = ['col%d' % (x+1) for x in range(NCOLS)] |
| 181 if len(args.header.strip()) > 0: | 196 if len(args.header.strip()) > 0: |
| 182 newcols = args.header.split(',') | 197 newcols = args.header.split(',') |
| 183 if len(newcols) == NCOLS: | 198 if len(newcols) == NCOLS: |
| 184 df.columns = newcols | 199 df.columns = newcols |
| 185 else: | 200 else: |
| 186 sys.stderr.write('#### Supplied header %s has %d comma delimited header names - does not match the input tabular file %d columns - using col1,...coln' % (args.header, len(newcols), NCOLS)) | 201 sys.stderr.write('#### Supplied header %s has %d comma delimited header names - does not match the input tabular file %d columns - using col1,...coln' % (args.header, len(newcols), NCOLS)) |
| 187 df.columns = defaultcols | 202 df.columns = defaultcols |
| 188 else: | 203 else: |
| 189 df.columns = defaultcols | 204 df.columns = defaultcols |
| 190 df['evalue'] = [-math.log(x) for x in df['evalue']] # convert so large values reflect statistical surprise | 205 df['evalue'] = [-math.log(x + 1e-308) for x in df['evalue']] # convert so large values reflect statistical surprise |
| 191 if len(args.colourcol.strip()) == 0: | 206 if len(args.colourcol.strip()) == 0: |
| 192 fig = px.scatter(df, x=args.xcol, y=args.ycol, hover_name=args.hovercol) | 207 fig = px.scatter(df, x=args.xcol, y=args.ycol, hover_name=args.hovercol) |
| 193 else: | 208 else: |
| 194 fig = px.scatter(df, x=args.xcol, y=args.ycol, color=args.colourcol, hover_name=args.hovercol) | 209 fig = px.scatter(df, x=args.xcol, y=args.ycol, color=args.colourcol, hover_name=args.hovercol) |
| 195 if args.title: | 210 if args.title: |
| 196 ftitle=dict(text=args.title, font=dict(size=50), automargin=True) | 211 ftitle=dict(text=args.title, font=dict(size=40), automargin=True) |
| 197 fig.update_layout(title=ftitle) | 212 fig.update_layout(title=ftitle) |
| 198 for scatter in fig.data: | 213 for scatter in fig.data: |
| 199 scatter['x'] = [str(x)[:MAXLEN] + '..' if len(str(x)) > MAXLEN else x for x in scatter['x']] | 214 scatter['x'] = [str(x)[:MAXLEN] + '..' if len(str(x)) > MAXLEN else x for x in scatter['x']] |
| 200 scatter['y'] = [str(x)[:MAXLEN] + '..' if len(str(x)) > MAXLEN else x for x in scatter['y']] | 215 scatter['y'] = [str(x)[:MAXLEN] + '..' if len(str(x)) > MAXLEN else x for x in scatter['y']] |
| 216 if len(args.colourcol.strip()) == 0: | |
| 217 sl = str(scatter['legendgroup']) | |
| 218 if len(sl) > MAXLEN: | |
| 219 scatter['legendgroup'] = sl[:MAXLEN] | |
| 201 fig.write_html(args.htmlout) | 220 fig.write_html(args.htmlout) |
| 202 fig.show() | |
| 203 | 221 |
| 204 ]]></help> | 222 ]]></help> |
| 205 <citations> | 223 <citations> |
| 206 <citation type="doi">10.1093/bioinformatics/bts573</citation> | 224 <citation type="doi">10.1093/bioinformatics/bts573</citation> |
| 207 </citations> | 225 </citations> |
