comparison galaxy/wrappers/ExprQCplots.xml @ 0:488e6e8bb8cb draft

"planemo upload for repository https://github.com/juliechevalier/GIANT/tree/master commit cb276a594444c8f32e9819fefde3a21f121d35df"
author vandelj
date Fri, 26 Jun 2020 09:41:56 -0400
parents
children 0435f94d27a7
comparison
equal deleted inserted replaced
-1:000000000000 0:488e6e8bb8cb
1 <tool name="GIANT-QC Plots" id="giant_plot_functions" version="0.1.3">
2 <description>Descriptive plots of .CEL collections or normalized expression data</description>
3 <requirements>
4 <requirement type="package" version="1.40.1">bioconductor-oligo</requirement>
5 <requirement type="package" version="2.2_13">r-ff</requirement>
6 <requirement type="package" version="2.2.1">r-ggplot2</requirement>
7 <requirement type="package" version="4.5.6">r-plotly</requirement>
8 <requirement type="package" version="1.8_17">r-mgcv</requirement>
9 </requirements>
10 <code file="../../src/General_functions.py"/>
11 <stdio>
12 <regex match="Execution halted"
13 source="both"
14 level="fatal"
15 description="Execution halted, please contact tool developer or administrators." />
16 <regex match="Error in"
17 source="both"
18 level="fatal"
19 description="An error occured during R execution, please contact tool developer." />
20 <exit_code range="15" level="fatal" description="Error during formating scripts, see log file for more information." />
21 <exit_code range="10" level="fatal" description="Missing file during html report, see log file for more information." />
22 <exit_code range="1:9" level="fatal" description="Error in R execution, see log file for more information." />
23 </stdio>
24 <command> <![CDATA[
25 ##set $dataType=$dataFile.extension
26 #set $dataType=$dataFile[0].ext
27
28 #if $conditionInformation and $pcaSection.factorsToInclude!="None":
29 bash $scriptPrepareTable;
30 ret_code=\$?;
31 if [ \$ret_code != 0 ]; then
32 exit \$ret_code;
33 fi;
34 #end if
35
36 #if ($dataType == "cel" and len($dataFile)>1) or ($dataType == "tabular" and len($dataFile)==1):
37 Rscript '$__tool_directory__/../../src/ExprPlotsScript.R' -i '$dataFile' -l '$log' -f '$advSection.imageFormat' -j '$dataType'
38 #if $dataType == "cel":
39 #for $inputDataset in $dataFile
40 -c '${inputDataset.name}'
41 #end for
42 #end if
43 #if $conditionInformation and $pcaSection.factorsToInclude!="None":
44 -t 'factorTable.csv'
45 #end if
46 #if $plotSection.histogramToPlot:
47 -h 'Histograms'
48 #end if
49 #if $plotSection.maplotToPlot:
50 -a 'MAplots'
51 #end if
52 #if $plotSection.boxplotToPlot:
53 -b 'Boxplots'
54 #end if
55 #if $plotSection.microarrayToPlot and $dataType == "cel":
56 -m 'Microarray'
57 #end if
58 #if $pcaSection.acpToPlot:
59 -p 'PCA'
60 -s 'screePlot'
61 #end if
62 ;
63 ret_code=\$?;
64 if [ \$ret_code != 0 ]; then
65 exit \$ret_code;
66 else
67 bash $scriptTransfer;
68 ret_code=\$?;
69 if [ \$ret_code != 0 ]; then
70 exit \$ret_code;
71 fi
72 fi;
73 #else:
74 printf "[ERROR]Execution halted, not enough (.CEL files) or too many (tabular file) input files" >> $log;
75 exit 15;
76 #end if
77 printf "[INFO]End of tool script" >> $log;
78 ]]>
79 </command>
80
81
82
83 <configfiles>
84 <configfile name="scriptPrepareTable">
85 <![CDATA[
86 awk -v fact="$pcaSection.factorsToInclude" 'BEGIN{FS="\t";OFS="";ORS="";split(fact, factors, ",");for(i in factors)factorsName[factors[i]]=1} NR==1{for(i=2;i<=NF;i++){if(\$i in factorsName)positFactor[i]=1}} {print $1;for(factorID in positFactor)print "\t"\$factorID; print "\n"}' $conditionInformation > ./factorTable.csv;
87
88 if [ ! -e ./factorTable.csv ]; then
89 printf "[ERROR]factorTable.csv is missing" >> $log;
90 exit 15
91 fi
92 printf "[INFO]End of scriptPrepareTable\n" >> $log
93 ]]>
94 </configfile>
95
96 <configfile name="scriptTransfer">
97 <![CDATA[
98 #set $dataType=$dataFile[0].ext
99 #set $cnt=1
100
101 ##create header of HTML file
102 printf "<!DOCTYPE html>\n<html>\n" > $html_file
103
104 ##add to HTML scripts to show and hide MAplots and MicroArray pictures
105
106 printf "<head>
107 <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js\"></script>
108 <script>
109 \\$(document).ready(function(){
110 \\$(\"\#MAplotTitle\").click(function(){
111 if(\\$(\"p.MAplot\").is(\':visible\'))\\$(\"p.MAplot\").hide(1000);
112 else \\$(\"p.MAplot\").show(1000);
113 });
114 \\$(\"\#MicroarrayTitle\").click(function(){
115 if(\\$(\"p.Microarray\").is(\':visible\'))\\$(\"p.Microarray\").hide(1000);
116 else \\$(\"p.Microarray\").show(1000);
117 });
118 });
119 </script>
120 </head>\n<body>\n" >> $html_file
121
122 mkdir -p $html_file.extra_files_path
123
124
125
126 #if $plotSection.histogramToPlot:
127
128 printf "<h3>Histograms</h3>\n" >> $html_file
129 ##create folders in media
130 counter=1
131 for histogram in \$(ls ./plotLyDir/Histograms*html)
132 do
133 histogramShort=\${histogram%\.*}
134 histogramShort=\${histogramShort\#\#*/}
135
136 ##modify HTML to point to plotLy folder
137 sed -i "s/\${histogramShort}_files/PlotLy_scripts/g" \$histogram
138
139 ##copy HTML files in both folders
140 cp \$histogram ${html_file.extra_files_path}/Histograms\${counter}.html
141
142 ##add HTML link
143 printf "<a href=\"Histograms\${counter}.html\">Histograms\${counter}</a>\n" >> $html_file
144
145 if [ \$counter = 1 ]; then
146
147 #if $advSection.imagePlotlyFormat=="svg":
148 ##before copying modify plotLy script to replace png snapshot with svg (not proud of solution but seems to work)
149 cd ./plotLyDir/\${histogramShort}_files/plotlyjs-*/
150 awk '{gsub("e=\"png\"","e=\"svg\"",\$0);print \$0}' ./plotly-latest.min.js > ./plotly-latest.minTemp.js
151 awk '{gsub("Download plot as a png","Download plot as a svg",\$0);print \$0}' ./plotly-latest.minTemp.js > ./plotly-latest.min.js
152 rm ./plotly-latest.minTemp.js
153 cd ../../../
154 #end if
155
156 ##copy only scripts folder for the first histogram
157 cp -r ./plotLyDir/\${histogramShort}_files $html_file.extra_files_path
158 mv ${html_file.extra_files_path}/\${histogramShort}_files ${html_file.extra_files_path}/PlotLy_scripts
159 fi
160
161 ((counter++))
162 done
163
164 if [ \$counter = 1 ]; then
165 printf "[ERROR]Histograms are missing" >> $log;
166 exit 10
167 fi
168
169 #end if
170
171
172
173 #if $plotSection.boxplotToPlot:
174
175 printf "<h3>Boxplots</h3>\n" >> $html_file
176
177 ##create folders in media
178 counter=1
179 for boxplot in \$(ls ./plotLyDir/Boxplots*html)
180 do
181 boxplotShort=\${boxplot%\.*}
182 boxplotShort=\${boxplotShort\#\#*/}
183
184 ##modify HTML to point to plotLy folder
185 sed -i "s/\${boxplotShort}_files/PlotLy_scripts/g" \$boxplot
186
187 ##copy HTML files in both folders
188 cp \$boxplot ${html_file.extra_files_path}/Boxplots\${counter}.html
189
190 ##add HTML link
191 printf "<a href=\"Boxplots\${counter}.html\">Boxplots\${counter}</a>\n" >> $html_file
192
193 if [ \$counter = 1 ]; then
194 #if $advSection.imagePlotlyFormat=="svg":
195 ##before copying modify plotLy script to replace png snapshot with svg (not proud of solution but seems to work)
196 cd ./plotLyDir/\${boxplotShort}_files/plotlyjs-*/
197 awk '{gsub("e=\"png\"","e=\"svg\"",\$0);print \$0}' ./plotly-latest.min.js > ./plotly-latest.minTemp.js
198 awk '{gsub("Download plot as a png","Download plot as a svg",\$0);print \$0}' ./plotly-latest.minTemp.js > ./plotly-latest.min.js
199 rm ./plotly-latest.minTemp.js
200 cd ../../../
201 #end if
202
203 ##copy only scripts folder for the first boxplot
204 cp -r ./plotLyDir/\${boxplotShort}_files $html_file.extra_files_path
205 mv ${html_file.extra_files_path}/\${boxplotShort}_files ${html_file.extra_files_path}/PlotLy_scripts
206 fi
207
208 ((counter++))
209 done
210
211 if [ \$counter = 1 ]; then
212 printf "[ERROR]Boxplots are missing" >> $log;
213 exit 10
214 fi
215
216 #end if
217
218
219
220 #if $plotSection.maplotToPlot:
221
222 printf "<h3 id=\"MAplotTitle\">MA plots (show/hide)</h3>\n" >> $html_file
223
224 ##create folders in media
225 counter=1
226 for MAplot in \$(ls ./plotLyDir/MAplots_*html)
227 do
228 MAplotShort=\${MAplot%\.*}
229 MAplotShort=\${MAplotShort\#\#*/}
230
231 conditionName=\${MAplot%\.*}
232 conditionName=\${conditionName\#\#*MAplots_}
233
234 echo \$conditionName > ./temporaryConditionName
235 conditionFormatedName=\$(awk 'BEGIN{FS="\t"} ARGIND==1{dico[\$1]=\$2} ARGIND==2{print dico[\$1]}' ./correspondanceFileNames.csv ./temporaryConditionName)
236
237 ##modify HTML to point to plotLy folder
238 sed -i "s/\${MAplotShort}_files/PlotLy_scripts/g" \$MAplot
239
240 ##copy HTML files in both folders
241 cp \$MAplot ${html_file.extra_files_path}/MAplot_\$conditionName.html
242
243 ##add HTML link
244 printf "<p class=\"MAplot\">\n<a href=\"MAplot_\$conditionName.html\">MAplot \$conditionFormatedName</a>\n</p>\n" >> $html_file
245
246 if [ \$counter = 1 ]; then
247 ##copy only scripts folder for the first MAplot
248
249 #if $advSection.imagePlotlyFormat=="svg":
250 ##before copying modify plotLy script to replace png snapshot with svg (not proud of solution but seems to work)
251 cd ./plotLyDir/\${MAplotShort}_files/plotlyjs-*/
252 awk '{gsub("e=\"png\"","e=\"svg\"",\$0);print \$0}' ./plotly-latest.min.js > ./plotly-latest.minTemp.js
253 awk '{gsub("Download plot as a png","Download plot as a svg",\$0);print \$0}' ./plotly-latest.minTemp.js > ./plotly-latest.min.js
254 rm ./plotly-latest.minTemp.js
255 cd ../../../
256 #end if
257
258 cp -r ./plotLyDir/\${MAplotShort}_files $html_file.extra_files_path
259 mv ${html_file.extra_files_path}/\${MAplotShort}_files ${html_file.extra_files_path}/PlotLy_scripts
260 fi
261
262 ((counter++))
263 done
264
265 if [ \$counter = 1 ]; then
266 printf "[ERROR]MAplots are missing" >> $log;
267 exit 10
268 fi
269
270 #end if
271
272
273
274
275 #if $plotSection.microarrayToPlot and $dataType == "cel":
276
277 printf "<h3 id=\"MicroarrayTitle\">Microarray</h3>\n" >> $html_file
278 for microarray in \$(ls ./plotDir/Microarray_*)
279 do
280 conditionName=\${microarray%\.*}
281 conditionName=\${conditionName\#\#*Microarray_}
282
283 echo \$conditionName > ./temporaryConditionName
284 conditionFormatedName=\$(awk 'BEGIN{FS="\t"} ARGIND==1{dico[\$1]=\$2} ARGIND==2{print dico[\$1]}' ./correspondanceFileNames.csv ./temporaryConditionName)
285
286 cp \$microarray ${html_file.extra_files_path}/Microarray_\$conditionName.${advSection.imageFormat}
287 printf "<p class=\"Microarray\"><a href=\"Microarray_\$conditionName.${advSection.imageFormat}\">Microarray \$conditionFormatedName</a>\n</p>" >> $html_file
288 done
289
290 #end if
291
292
293
294
295 #if $pcaSection.acpToPlot:
296
297 printf "<h3>PCA</h3>\n" >> $html_file
298
299 ##create folders in media
300 counter=1
301 for pca in \$(ls ./plotLyDir/PCA*html)
302 do
303 pcaShort=\${pca%\.*}
304 pcaShort=\${pcaShort\#\#*/}
305
306 conditionName=\${pca%\.*}
307 conditionName=\${conditionName\#\#*PCA_}
308
309 echo \$conditionName > ./temporaryConditionName
310 conditionFormatedName=\$(awk 'BEGIN{FS="\t"} ARGIND==1{dico[\$1]=\$2} ARGIND==2{split(\$0,tab,"_AND_");if(length(tab)==1){if(\$0 in dico){print dico[\$0]}else{print $0}}else{print dico[tab[1]]" * "dico[tab[2]]}}' ./correspondanceFileNames.csv ./temporaryConditionName)
311
312 ##modify HTML to point to plotLy folder
313 sed -i "s/\${pcaShort}_files/PlotLy_scripts/g" \$pca
314
315 ##copy HTML files in both folders
316 cp \$pca ${html_file.extra_files_path}/PCA_\$conditionName.html
317
318 ##add HTML link
319 printf "<p><a href=\"PCA_\$conditionName.html\">PCA \$conditionFormatedName</a>\n</p>" >> $html_file
320
321
322 if [ \$counter = 1 ]; then
323
324 #if $advSection.imagePlotlyFormat=="svg":
325 ##before copying modify plotLy script to replace png snapshot with svg (not proud of solution but seems to work)
326 cd ./plotLyDir/\${pcaShort}_files/plotlyjs-*/
327 awk '{gsub("e=\"png\"","e=\"svg\"",\$0);print \$0}' ./plotly-latest.min.js > ./plotly-latest.minTemp.js
328 awk '{gsub("Download plot as a png","Download plot as a svg",\$0);print \$0}' ./plotly-latest.minTemp.js > ./plotly-latest.min.js
329 rm ./plotly-latest.minTemp.js
330 cd ../../../
331 #end if
332
333 ##copy only scripts folder for the first pca
334 cp -r ./plotLyDir/\${pcaShort}_files $html_file.extra_files_path
335 mv ${html_file.extra_files_path}/\${pcaShort}_files ${html_file.extra_files_path}/PlotLy_scripts
336 fi
337
338 ((counter++))
339 done
340
341 if [ \$counter = 1 ]; then
342 printf "[ERROR]PCA plots are missing" >> $log;
343 exit 10
344 fi
345
346 ##now for screePlot
347 if [ -e ./plotLyDir/screePlot.html ]; then
348 ##copy HTML files in both folders
349 cp ./plotLyDir/screePlot.html ${html_file.extra_files_path}/screePlot.html
350 ##add HTML link
351 printf "<p><a href=\"screePlot.html\">Scree plot</a>\n</p>" >> $html_file
352 else
353 printf "[ERROR]screePlot.html is missing" >> $log;
354 exit 10
355 fi
356
357 ##copy scripts folder
358
359 #if $advSection.imagePlotlyFormat=="svg":
360 ##but before copying modify plotLy script to replace png snapshot with svg (not proud of solution but seems to work)
361 cd ./plotLyDir/screePlot_files/plotlyjs-*/
362 awk '{gsub("e=\"png\"","e=\"svg\"",\$0);print \$0}' ./plotly-latest.min.js > ./plotly-latest.minTemp.js
363 awk '{gsub("Download plot as a png","Download plot as a svg",\$0);print \$0}' ./plotly-latest.minTemp.js > ./plotly-latest.min.js
364 rm ./plotly-latest.minTemp.js
365 cd ../../../
366 #end if
367
368 cp -r ./plotLyDir/screePlot_files $html_file.extra_files_path
369
370 #end if
371
372
373 ##create footer of HTML file
374 printf "</body>\n</html>" >> $html_file
375 ]]>
376 </configfile>
377 </configfiles>
378
379
380
381 <inputs>
382 <param type="text" name="title" value="PlotFigure_toPersonalize" label="Title for output">
383 </param>
384 <param type="data" name="dataFile" format="cel,tabular" label="Select one .CEL collection or one tabular file" optional="false" multiple="true" >
385 </param>
386
387 <section name="plotSection" title="Plots selection" expanded="True">
388 <param type="boolean" name="histogramToPlot" checked="true" label="Plot histograms" help="Plot intensity distribution for each condition (pm probes for .cel)">
389 </param>
390 <param type="boolean" name="maplotToPlot" checked="true" label="Plot MA plots" help="Plot MA plot for each condition, median value is used as reference">
391 </param>
392 <param type="boolean" name="boxplotToPlot" checked="true" label="Plot boxplots" help="Plot intensity through boxplot for each condition (pm probes for .cel)">
393 </param>
394 <param type="boolean" name="microarrayToPlot" checked="true" label="Display microarray images (only for .CEL files)">
395 </param>
396
397 </section>
398 <section name="pcaSection" title="PCA analysis" expanded="True">
399 <param type="boolean" name="acpToPlot" checked="true" label="Plot 3D PCA" help="3D plot of conditions in the space defined by the 3 principal components">
400 </param>
401 <param type="data" name="conditionInformation" format="tabular" label="Factor information tabular file (optional)" optional="true" multiple="false">
402 </param>
403 <param name="factorsToInclude" type="select" optional="true" multiple="true" label="Select factor informations to display (optional)"
404 refresh_on_change="true" dynamic_options="get_column_names(pcaSection['conditionInformation'].file_name,0)">
405 <validator type="empty_field" message="You should specify one factor"></validator>
406 </param>
407
408 </section>
409
410 <section name="advSection" title="Advanced parameters" expanded="False">
411 <param type="select" name="imageFormat" display="radio" label="Output microarray image format">
412 <option value="png">PNG format</option>
413 <option value="pdf">PDF format</option>
414 </param>
415 <param type="select" name="imagePlotlyFormat" display="radio" label="Html snapshot format">
416 <option value="png">PNG format</option>
417 <option value="svg">SVG format</option>
418 </param>
419 </section>
420
421 </inputs>
422
423
424
425 <outputs>
426 <data format="html" name="html_file" label="${title}_HTML.html"/>
427 <!--
428 <collection name="outputHistogramsList" label="${title}_HistogramsList" type="list">
429 <discover_datasets pattern="(?P&lt;designation&gt;Histograms[0-9]+)\.(?P&lt;ext&gt;[^\._]+)?" directory="plotDir" visible="false"/>
430 <filter>plotSection['histogramToPlot']</filter>
431 </collection>
432
433 <collection name="outputMAplotsList" label="${title}_MAplotsList" type="list">
434 <discover_datasets pattern="(?P&lt;designation&gt;MAplots[0-9]+)\.(?P&lt;ext&gt;[^\._]+)?" directory="plotDir" visible="false"/>
435 <filter>plotSection['maplotToPlot']</filter>
436 </collection>
437
438 <collection name="outputBoxplotsList" label="${title}_BoxplotsList" type="list">
439 <discover_datasets pattern="(?P&lt;designation&gt;Boxplots[0-9]+)\.(?P&lt;ext&gt;[^\._]+)?" directory="plotDir" visible="false"/>
440 <filter>plotSection['boxplotToPlot']</filter>
441 </collection>
442
443 <collection name="outputMicroarrayList" label="${title}_MicroarrayList" type="list">
444 <discover_datasets pattern="(?P&lt;designation&gt;Microarray\_.*)\.(?P&lt;ext&gt;[^\._]+)?" directory="plotDir" visible="false"/>
445 <filter>plotSection['microarrayToPlot'] and dataFile[0].ext == "cel"</filter>
446 </collection>
447
448 <collection name="outputPCAList" label="${title}_PCA" type="list">
449 <discover_datasets pattern="(?P&lt;designation&gt;PCA[0-9]+)\.(?P&lt;ext&gt;[^\._]+)?" directory="plotDir" visible="false"/>
450 <discover_datasets pattern="(?P&lt;designation&gt;screePlot)\.(?P&lt;ext&gt;[^\._]+)?" directory="plotDir" visible="false"/>
451 <filter>pcaSection['acpToPlot']</filter>
452 </collection>
453 -->
454 <data name="log" label="${title}_Log" format="txt"/>
455 </outputs>
456
457
458
459 <tests>
460 <test maxseconds="3600">
461 <param name="wfile" value="wiggle.wig" />
462 <param name="bfile" value="bedfile.bed" />
463 <param name="span" value="3000" />
464 <param name="pfres" value="50" />
465 <param name="lowersize" value="1000" />
466 <param name="middlesize" value="2000" />
467 <param name="uppersize" value="3000" />
468 <param name="lowerbisize" value="2500" />
469 <param name="upperbisize" value="5000" />
470 <param name="reldist" value="3000" />
471 <param name="genome" value="hg18" />
472 <param name="imagetype" value="PDF" />
473 <param name="enable" value="no" />
474 <output name="log" file="ceas_1/ceas_1.pdf" />
475 </test>
476 </tests>
477
478
479
480 <help>
481 <![CDATA[
482 **What it does ?**
483
484 This tool generate descriptive plots for Affymetrix raw data (.CEL file) or any tabular file containing expression data (from arrays or RNA-seq).
485
486 -----
487
488 **Parameters**
489
490 \- **Title** to personalize output file names (please avoid special characters and spaces).
491
492 \- **Input Data**
493
494 - **.CEL files** of your study (you can select multiple .CEL files or unique collection). For vizualization purposes, expression data extracted from .CEL files will be automatically log2 transformed by the tool.
495
496 OR
497
498 - **Expression tabular file** with samples as columns and genes as rows (header row contains sample names and first column gene identifiers). For better vizualization, expression data sould be preferentially already log2 transformed, no such transformation will be performed by the tool.
499
500 ::
501
502 Conditions 157_(HuGene-2_0-st).CEL 156_(HuGene-2_0-st).CEL 155_(HuGene-2_0-st).CEL 154_(HuGene-2_0-st).CEL
503 DDX11L2 4.500872 4.429759 4.780281 4.996189
504 MIR1302-2 3.415065 3.520472 3.471503 3.567988
505 OR4F5 3.737956 3.011586 3.424494 3.497545
506 VWA1 5.189621 5.129595 4.806793 5.227014
507
508 \- **Plots selection**
509 : to select required plots
510
511 - **Plot histograms**
512 - **Plot MA plots**
513 - **Plot boxplots**
514 - **Display microarray images** (only if "Input Data" are .CEL files)
515
516 \- **PCA analysis**
517
518 - **Plot 3D PCA** plot the 3 first principal components
519 - **Factor information tabular file** with factors as columns and samples as rows (header row contains factor names and first column sample names). Can help to discriminate samples in PCA plot.
520
521 ::
522
523 Conditions Sex Treatment Reaction
524 138_(HuGene-2_0-st).CEL 1 TreatA Pos
525 148_(HuGene-2_0-st).CEL 0 NoTreat Pos
526 139_(HuGene-2_0-st).CEL 0 TreatB Neg
527 149_(HuGene-2_0-st).CEL 0 NoTreat Neg
528
529 - **Select factor informations** you want to display in PCA plot (1 for samples colors and 1 for samples shapes)
530
531 \- **Advanced parameters**
532
533 - **Output microarray image format** available only for .CEL input files
534 - **Html snapshot format** : format of plot images taken from interactive view
535
536 -----
537
538 \- **Outputs**
539
540 - **HTML file** to access interactive version of plots through PlotLy html pages
541 - **LOG file** for job logs. In case of job failure, please attached this file to bug report
542 ]]> </help>
543
544 <citations>
545 <citation type="bibtex">@misc{vandel_jimmy_2018_1477870, author = {Vandel, J. and Gheeraert, C. and Eeckhoute, J. and Staels, B. and Lefebvre, P. and Dubois-Chevalier, J.}, title = {GIANT: Galaxy-based Interactive tools for ANalaysis of Transcriptomic data}, month = nov, year = 2018, doi = {10.5281/zenodo.1477870}, url = {https://doi.org/10.5281/zenodo.1477870}
546 }</citation>
547
548 <citation type="bibtex">@online{plotly, author = {Plotly Technologies Inc.}, title = {Collaborative data science}, publisher = {Plotly Technologies Inc.}, address = {Montreal, QC}, year = {2015}, url = {https://plot.ly}
549 }</citation>
550 </citations>
551
552 </tool>