<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Publishing DTD v1.1d3 20150301//EN" "http://jats.nlm.nih.gov/publishing/1.1d3/JATS-journalpublishing1.dtd">
<article article-type="research-article" dtd-version="1.1d3" xml:lang="en" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink">
<front>
<journal-meta>
<journal-id journal-id-type="nlm-ta">PLoS ONE</journal-id>
<journal-id journal-id-type="publisher-id">plos</journal-id>
<journal-id journal-id-type="pmc">plosone</journal-id>
<journal-title-group>
<journal-title>PLOS ONE</journal-title>
</journal-title-group>
<issn pub-type="epub">1932-6203</issn>
<publisher>
<publisher-name>Public Library of Science</publisher-name>
<publisher-loc>San Francisco, CA USA</publisher-loc>
</publisher>
</journal-meta>
<article-meta>
<article-id pub-id-type="doi">10.1371/journal.pone.0252488</article-id>
<article-id pub-id-type="publisher-id">PONE-D-21-03838</article-id>
<article-categories>
<subj-group subj-group-type="heading">
<subject>Research Article</subject>
</subj-group>
<subj-group subj-group-type="Discipline-v3">
<subject>Computer and information sciences</subject><subj-group><subject>Data management</subject><subj-group><subject>Data visualization</subject></subj-group></subj-group></subj-group><subj-group subj-group-type="Discipline-v3">
<subject>Computer and information sciences</subject><subj-group><subject>Software engineering</subject><subj-group><subject>Computer software</subject></subj-group></subj-group></subj-group><subj-group subj-group-type="Discipline-v3">
<subject>Engineering and technology</subject><subj-group><subject>Software engineering</subject><subj-group><subject>Computer software</subject></subj-group></subj-group></subj-group><subj-group subj-group-type="Discipline-v3">
<subject>Computer and information sciences</subject><subj-group><subject>Software engineering</subject><subj-group><subject>Source code</subject></subj-group></subj-group></subj-group><subj-group subj-group-type="Discipline-v3">
<subject>Engineering and technology</subject><subj-group><subject>Software engineering</subject><subj-group><subject>Source code</subject></subj-group></subj-group></subj-group><subj-group subj-group-type="Discipline-v3">
<subject>Computer and information sciences</subject><subj-group><subject>Computer applications</subject><subj-group><subject>Web-based applications</subject></subj-group></subj-group></subj-group><subj-group subj-group-type="Discipline-v3">
<subject>Computer and information sciences</subject><subj-group><subject>Computers</subject></subj-group></subj-group><subj-group subj-group-type="Discipline-v3">
<subject>Computer and information sciences</subject><subj-group><subject>Computer architecture</subject><subj-group><subject>Computer hardware</subject></subj-group></subj-group></subj-group><subj-group subj-group-type="Discipline-v3">
<subject>Computer and information sciences</subject><subj-group><subject>Software engineering</subject><subj-group><subject>Parsers</subject></subj-group></subj-group></subj-group><subj-group subj-group-type="Discipline-v3">
<subject>Engineering and technology</subject><subj-group><subject>Software engineering</subject><subj-group><subject>Parsers</subject></subj-group></subj-group></subj-group><subj-group subj-group-type="Discipline-v3">
<subject>Engineering and technology</subject><subj-group><subject>Industrial engineering</subject><subj-group><subject>Control engineering</subject><subj-group><subject>Automation</subject></subj-group></subj-group></subj-group></subj-group></article-categories>
<title-group>
<article-title><italic>PlateEditor</italic>: A web-based application for the management of multi-well plate layouts and associated data</article-title>
<alt-title alt-title-type="running-head"><italic>PlateEditor</italic>: in-browser management of plate layouts and data</alt-title>
</title-group>
<contrib-group>
<contrib contrib-type="author" corresp="yes" xlink:type="simple">
<contrib-id authenticated="true" contrib-id-type="orcid">https://orcid.org/0000-0001-5235-7069</contrib-id>
<name name-style="western">
<surname>Delorme</surname>
<given-names>Vincent</given-names>
</name>
<role content-type="https://casrai.org/credit/">Conceptualization</role>
<role content-type="https://casrai.org/credit/">Software</role>
<role content-type="https://casrai.org/credit/">Supervision</role>
<role content-type="https://casrai.org/credit/">Writing – original draft</role>
<xref ref-type="corresp" rid="cor001">*</xref>
<xref ref-type="aff" rid="aff001"/>
</contrib>
<contrib contrib-type="author" xlink:type="simple">
<name name-style="western">
<surname>Woo</surname>
<given-names>Minjeong</given-names>
</name>
<role content-type="https://casrai.org/credit/">Validation</role>
<role content-type="https://casrai.org/credit/">Writing – review &amp; editing</role>
<xref ref-type="aff" rid="aff001"/>
</contrib>
<contrib contrib-type="author" xlink:type="simple">
<name name-style="western">
<surname>Falcão</surname>
<given-names>Virginia Carla de Almeida</given-names>
</name>
<role content-type="https://casrai.org/credit/">Validation</role>
<role content-type="https://casrai.org/credit/">Writing – review &amp; editing</role>
<xref ref-type="aff" rid="aff001"/>
</contrib>
<contrib contrib-type="author" xlink:type="simple">
<name name-style="western">
<surname>Wood</surname>
<given-names>Connor</given-names>
</name>
<role content-type="https://casrai.org/credit/">Validation</role>
<role content-type="https://casrai.org/credit/">Writing – review &amp; editing</role>
<xref ref-type="aff" rid="aff001"/>
</contrib>
</contrib-group>
<aff id="aff001"><addr-line>Tuberculosis Research Laboratory, Institut Pasteur Korea, Seongnam, Gyeonggi, Republic of Korea</addr-line></aff>
<contrib-group>
<contrib contrib-type="editor" xlink:type="simple">
<name name-style="western">
<surname>Corpas</surname>
<given-names>Manuel</given-names>
</name>
<role>Editor</role>
<xref ref-type="aff" rid="edit1"/>
</contrib>
</contrib-group>
<aff id="edit1"><addr-line>Universidad Internacional de La Rioja, SPAIN</addr-line></aff>
<author-notes>
<fn fn-type="conflict" id="coi001">
<p>The authors have declared that no competing interests exist.</p>
</fn>
<corresp id="cor001">* E-mail: <email xlink:type="simple">vincent.delorme@ip-korea.org</email></corresp>
</author-notes>
<pub-date pub-type="epub">
<day>28</day>
<month>5</month>
<year>2021</year>
</pub-date>
<pub-date pub-type="collection">
<year>2021</year>
</pub-date>
<volume>16</volume>
<issue>5</issue>
<elocation-id>e0252488</elocation-id>
<history>
<date date-type="received">
<day>3</day>
<month>2</month>
<year>2021</year>
</date>
<date date-type="accepted">
<day>15</day>
<month>5</month>
<year>2021</year>
</date>
</history>
<permissions>
<copyright-year>2021</copyright-year>
<copyright-holder>Delorme et al</copyright-holder>
<license xlink:href="http://creativecommons.org/licenses/by/4.0/" xlink:type="simple">
<license-p>This is an open access article distributed under the terms of the <ext-link ext-link-type="uri" xlink:href="http://creativecommons.org/licenses/by/4.0/" xlink:type="simple">Creative Commons Attribution License</ext-link>, which permits unrestricted use, distribution, and reproduction in any medium, provided the original author and source are credited.</license-p>
</license>
</permissions>
<self-uri content-type="pdf" xlink:href="info:doi/10.1371/journal.pone.0252488"/>
<abstract>
<p>Multi-well plates are convenient tools to work with in biology experiments, as they allow the probing of multiple conditions in a compact and economic way. Although both free and commercial software exist for the definition of plate layout and management of plate data, we were looking for a more flexible solution, available anywhere, free from download, installation and licensing constraints. In this context, we created <italic>PlateEditor</italic>, a free web-based, client-side application allowing rapid creation of even complex layouts, including dose-response curves and multiple combination experiments for any plate format up to 1536 wells. <italic>PlateEditor</italic> also provides heatmap visualization and aggregation features to speed-up the process of data analysis and formatting for export in other application. Written in pure JavaScript, it is fully open-source, can be integrated in various workflows and has the potential to be extended with more functionalities in the future.</p>
</abstract>
<funding-group>
<award-group id="award001">
<funding-source>
<institution-wrap>
<institution-id institution-id-type="funder-id">http://dx.doi.org/10.13039/501100003725</institution-id>
<institution>National Research Foundation of Korea</institution>
</institution-wrap>
</funding-source>
<award-id>2017M3A9G6068246</award-id>
</award-group>
<award-group id="award002">
<funding-source>
<institution-wrap>
<institution-id institution-id-type="funder-id">http://dx.doi.org/10.13039/501100003725</institution-id>
<institution>National Research Foundation of Korea</institution>
</institution-wrap>
</funding-source>
<award-id>2019R1A2C2084652</award-id>
<principal-award-recipient>
<contrib-id authenticated="true" contrib-id-type="orcid">https://orcid.org/0000-0001-5235-7069</contrib-id>
<name name-style="western">
<surname>Delorme</surname>
<given-names>Vincent</given-names>
</name>
</principal-award-recipient>
</award-group>
<award-group id="award003">
<funding-source>
<institution-wrap>
<institution-id institution-id-type="funder-id">http://dx.doi.org/10.13039/501100003763</institution-id>
<institution>Ministère des Affaires Etrangères</institution>
</institution-wrap>
</funding-source>
<principal-award-recipient>
<contrib-id authenticated="true" contrib-id-type="orcid">https://orcid.org/0000-0001-5235-7069</contrib-id>
<name name-style="western">
<surname>Delorme</surname>
<given-names>Vincent</given-names>
</name>
</principal-award-recipient>
</award-group>
<award-group id="award004">
<funding-source>
<institution-wrap>
<institution-id institution-id-type="funder-id">http://dx.doi.org/10.13039/501100013173</institution-id>
<institution>Gyeonggi-do Regional Research Center</institution>
</institution-wrap>
</funding-source>
</award-group>
<funding-statement>This work was supported by the national research foundation of Korea (NRF), funded by the Korean Ministry of Science, ICT and Technology (MSIT, project numbers NRF-2017M3A9G6068246 and NRF-2019R1A2C2084652) as well as the Gyeonggi province, Korea. VD was supported by the French Ministry of Foreign Affairs. The funders had no role in study design, data collection and analysis, decision to publish, or preparation of the manuscript.</funding-statement>
</funding-group>
<counts>
<fig-count count="6"/>
<table-count count="1"/>
<page-count count="14"/>
</counts>
<custom-meta-group>
<custom-meta id="data-availability">
<meta-name>Data Availability</meta-name>
<meta-value>The application can be accessed at the following address: <ext-link ext-link-type="uri" xlink:href="https://plateeditor.sourceforge.io/" xlink:type="simple">https://plateeditor.sourceforge.io/</ext-link> The source code is available under the MIT license on the <italic>PlateEditor</italic> repository on GitHub (<ext-link ext-link-type="uri" xlink:href="https://github.com/vindelorme/PlateEditor" xlink:type="simple">https://github.com/vindelorme/PlateEditor</ext-link>) and the latest version of the full application can be downloaded as a zip archive on SourceForge (<ext-link ext-link-type="uri" xlink:href="https://sourceforge.net/projects/plateeditor" xlink:type="simple">https://sourceforge.net/projects/plateeditor</ext-link>).</meta-value>
</custom-meta>
</custom-meta-group>
</article-meta>
</front>
<body>
<sec id="sec001" sec-type="intro">
<title>Introduction</title>
<p>Multi-well plates offer a convenient and compact way to test multiple conditions in one go. From 6 to 1536 wells, made with various materials (plastic, glass) and for various purposes (optical measurements, filtration, storage), they can accommodate a broad range of assays and conditions. The greater availability of automation equipment, for example readers, washers and incubators, allows easy upscaling from a couple of plates to a full library of hundreds of plates. Screening activities have a heavy reliance on multi-well plates, but other common applications like enzyme-linked immunosorbent assays (ELISA) or dose-response curves are also commonly performed in multi-well plates. Most of the automation or plate reading software use or generate data files as lists, using the well name or row/column indices to locate the values at their relevant location. While this is ideal from an automation point-of-view our experience shows that such files are uncomfortable to read and work with for a regular lab worker, who will prefer a more visual, plate-like (or matrix-like) representation of the data, usually under the form of heatmap.</p>
<p>Every plate reader or plate-friendly device will propose such a tool to prepare plate layouts and analyze their associated data. Other commercial solutions exist for the creation and visualization of plate data (<italic>Pipeline Pilot</italic>, <italic>Spotfire</italic> and <italic>Dotmatics</italic>, among others). All of them are locked behind high licensing fees and may not be available to install on the individual computers of multiple researchers, or require connection to local databases, making them hardly available offsite. For us, such a feature has however become more and more desirable, precipitated by the current COVID epidemic and the constraints of home-working, which are likely also experienced by other researchers across the world. The possibility of exchanging layout data from lab to lab are also impaired by the proprietary format chosen by each vendor: layouts from different software are usually not compatible, or will require some form of post-processing before being usable elsewhere. Although free solutions are available for plate management, few offer a ready-to-use application (<italic>i</italic>.<italic>e</italic>. provided under the form of libraries) or were designed for or within specific applications. Some examples of free plate management systems featuring a plate layout editor include: <italic>Brunn</italic> [<xref ref-type="bibr" rid="pone.0252488.ref001">1</xref>], <italic>KNIME</italic> [<xref ref-type="bibr" rid="pone.0252488.ref002">2</xref>], <italic>AutoLabDB</italic> [<xref ref-type="bibr" rid="pone.0252488.ref003">3</xref>] and <italic>SLIMS</italic> [<xref ref-type="bibr" rid="pone.0252488.ref004">4</xref>]). The Java application <italic>DMAN</italic> also includes a layout editor [<xref ref-type="bibr" rid="pone.0252488.ref005">5</xref>], but is dedicated to differential scanning fluorimetry experiments. The <italic>JavaScript Plate Layout</italic> application is also freely available, but is provided as a library and limited to 96-well plates (<ext-link ext-link-type="uri" xlink:href="https://github.com/nebiolabs/plate-map" xlink:type="simple">https://github.com/nebiolabs/plate-map</ext-link>). Specifically, we were interested in an application that could cover all of the following features: <italic>i</italic>) free, ready and easy-to-use (visual) editor for definition of layouts for multi-well plates of any format, up to 1536-well plate; <italic>ii</italic>) web-based application, accessible anywhere from any device, free from module installation or need to download updates; <italic>iii</italic>) able to guarantee strict data confidentiality; <italic>iv</italic>) allowing basic but flexible data visualization and aggregation features.</p>
<p>To our knowledge there are currently no free applications reported that could cover all these needs. To cover this gap and provide additional tools for scientists working with multi-well plates, we developed <italic>PlateEditor</italic> and present here its main features and some usage examples. The application can be accessed at the following address: <ext-link ext-link-type="uri" xlink:href="https://plateeditor.sourceforge.io/" xlink:type="simple">https://plateeditor.sourceforge.io/</ext-link>.</p>
</sec>
<sec id="sec002" sec-type="materials|methods">
<title>Materials &amp; methods</title>
<sec id="sec003">
<title>Source code</title>
<p><italic>PlateEditor</italic> was written in pure JavaScript (JS) and uses only two external libraries as dependencies: <italic>PapaParse</italic>, for client-side parsing of text and csv files (v5.0; <ext-link ext-link-type="uri" xlink:href="https://www.papaparse.com/" xlink:type="simple">https://www.papaparse.com</ext-link>) and <italic>JSZip</italic>, for reading and writing of zip archives (v3.2.0; <ext-link ext-link-type="uri" xlink:href="https://stuk.github.io/jszip" xlink:type="simple">https://stuk.github.io/jszip</ext-link>). The source code is divided into four independent packages: <italic>editor</italic>.<italic>min</italic>.<italic>js</italic> regroups the classes needed by the plate layout editor; <italic>analyzer</italic>.<italic>min</italic>.<italic>js</italic> regroups the classes needed for data aggregation (including the Z-score calculation); <italic>shared</italic>.<italic>min</italic>.<italic>js</italic> regroups the classes needed for the file parsing, mapping and plate pairing; <italic>ui</italic>.<italic>min</italic>.<italic>js</italic> regroups the classes needed for the user interface. All classes and functions were written as independent JS files, organized in four folders named after the package to which they belonged (editor, analyzer, shared, ui). The packages were built by merging together all files from a single folder and minifying the resulting file, using the JS library Gulp (v4.0.0; <ext-link ext-link-type="uri" xlink:href="https://gulpjs.com/" xlink:type="simple">https://gulpjs.com/</ext-link>). The cascade style sheet (CSS) files used by the web application were written and packaged the same way (merged and minified using Gulp). Each JS package file has an associated CSS package file (<italic>editor-styles</italic>.<italic>css</italic>; <italic>analyzer-styles</italic>.<italic>css</italic>, <italic>shared-styles</italic>.<italic>css</italic> and <italic>ui-styles</italic>.<italic>css</italic>). To simplify the development and bug-tracking process, source maps were also generated with Gulp, allowing the initial, non-minified code to be referenced in the browser console upon code execution errors. The application was designed using Firefox Developer Edition (v85; <ext-link ext-link-type="uri" xlink:href="https://www.mozilla.org/" xlink:type="simple">https://www.mozilla.org</ext-link>) and tested with Google Chrome (v87) and Microsoft Edge (v87). The source code is available under the MIT license on the <italic>PlateEditor</italic> repository on GitHub (<ext-link ext-link-type="uri" xlink:href="https://github.com/vindelorme/PlateEditor" xlink:type="simple">https://github.com/vindelorme/PlateEditor</ext-link>) and SourceForge (<ext-link ext-link-type="uri" xlink:href="https://sourceforge.net/projects/plateeditor" xlink:type="simple">https://sourceforge.net/projects/plateeditor</ext-link>). The latest version of the full application, as well as the version available at the time of the manuscript review, can both be downloaded as zip archives on SourceForge or GitHub.</p>
</sec>
<sec id="sec004">
<title>Statistics</title>
<p>For a population of n discreet numerical values, whose average is equal to <italic>Avg</italic>, the standard deviation (SD) and coefficient of variation (CV, %) of the population were calculated as follows:
<disp-formula id="pone.0252488.e001">
<alternatives>
<graphic id="pone.0252488.e001g" mimetype="image" position="anchor" xlink:href="info:doi/10.1371/journal.pone.0252488.e001" xlink:type="simple"/>
<mml:math display="block" id="M1">
<mml:mi>S</mml:mi><mml:mi>D</mml:mi><mml:mo>=</mml:mo><mml:msqrt><mml:mfrac><mml:mrow><mml:mn>1</mml:mn></mml:mrow><mml:mrow><mml:mi>n</mml:mi></mml:mrow></mml:mfrac><mml:mrow><mml:munderover><mml:mo stretchy="false">∑</mml:mo><mml:mrow><mml:mi>i</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow><mml:mrow><mml:mi>n</mml:mi></mml:mrow></mml:munderover><mml:mrow><mml:msup><mml:mrow><mml:mo>(</mml:mo><mml:mrow><mml:msub><mml:mrow><mml:mi>x</mml:mi></mml:mrow><mml:mrow><mml:mi>i</mml:mi></mml:mrow></mml:msub><mml:mo>−</mml:mo><mml:mi>A</mml:mi><mml:mi>v</mml:mi><mml:mi>g</mml:mi></mml:mrow><mml:mo>)</mml:mo></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:mrow></mml:msqrt>
</mml:math>
</alternatives>
</disp-formula>
<disp-formula id="pone.0252488.e002">
<alternatives>
<graphic id="pone.0252488.e002g" mimetype="image" position="anchor" xlink:href="info:doi/10.1371/journal.pone.0252488.e002" xlink:type="simple"/>
<mml:math display="block" id="M2">
<mml:mi>C</mml:mi><mml:mi>V</mml:mi><mml:mo>=</mml:mo><mml:mn>100</mml:mn><mml:mo>×</mml:mo><mml:mfrac><mml:mrow><mml:mi>S</mml:mi><mml:mi>D</mml:mi></mml:mrow><mml:mrow><mml:mi>A</mml:mi><mml:mi>v</mml:mi><mml:mi>g</mml:mi></mml:mrow></mml:mfrac>
</mml:math>
</alternatives>
</disp-formula></p>
<p>The formula used for calculation of the Z-factor (Z’, [<xref ref-type="bibr" rid="pone.0252488.ref006">6</xref>]) and window (W) are as follows:
<disp-formula id="pone.0252488.e003">
<alternatives>
<graphic id="pone.0252488.e003g" mimetype="image" position="anchor" xlink:href="info:doi/10.1371/journal.pone.0252488.e003" xlink:type="simple"/>
<mml:math display="block" id="M3">
<mml:msup><mml:mrow><mml:mi>Z</mml:mi></mml:mrow><mml:mrow><mml:mo>′</mml:mo></mml:mrow></mml:msup><mml:mo>=</mml:mo><mml:mn>1</mml:mn><mml:mo>−</mml:mo><mml:mfrac><mml:mrow><mml:mn>3</mml:mn><mml:mo>×</mml:mo><mml:mo>(</mml:mo><mml:mrow><mml:msub><mml:mrow><mml:mi>S</mml:mi><mml:mi>D</mml:mi></mml:mrow><mml:mrow><mml:mi>p</mml:mi><mml:mi>o</mml:mi><mml:mi>s</mml:mi></mml:mrow></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mrow><mml:mi>S</mml:mi><mml:mi>D</mml:mi></mml:mrow><mml:mrow><mml:mi>n</mml:mi><mml:mi>e</mml:mi><mml:mi>g</mml:mi></mml:mrow></mml:msub></mml:mrow><mml:mo>)</mml:mo></mml:mrow><mml:mrow><mml:mo>|</mml:mo><mml:mrow><mml:msub><mml:mrow><mml:mi>A</mml:mi><mml:mi>v</mml:mi><mml:mi>g</mml:mi></mml:mrow><mml:mrow><mml:mi>p</mml:mi><mml:mi>o</mml:mi><mml:mi>s</mml:mi></mml:mrow></mml:msub><mml:mo>−</mml:mo><mml:msub><mml:mrow><mml:mi>A</mml:mi><mml:mi>v</mml:mi><mml:mi>g</mml:mi></mml:mrow><mml:mrow><mml:mi>n</mml:mi><mml:mi>e</mml:mi><mml:mi>g</mml:mi></mml:mrow></mml:msub></mml:mrow><mml:mo>|</mml:mo></mml:mrow></mml:mfrac>
</mml:math>
</alternatives>
</disp-formula>
<disp-formula id="pone.0252488.e004">
<alternatives>
<graphic id="pone.0252488.e004g" mimetype="image" position="anchor" xlink:href="info:doi/10.1371/journal.pone.0252488.e004" xlink:type="simple"/>
<mml:math display="block" id="M4">
<mml:mi>W</mml:mi><mml:mo>=</mml:mo><mml:mrow><mml:mo>{</mml:mo><mml:mtable><mml:mtr><mml:mtd><mml:mrow><mml:mfrac><mml:mrow><mml:msub><mml:mrow><mml:mi>A</mml:mi><mml:mi>v</mml:mi><mml:mi>g</mml:mi></mml:mrow><mml:mrow><mml:mi>p</mml:mi><mml:mi>o</mml:mi><mml:mi>s</mml:mi></mml:mrow></mml:msub></mml:mrow><mml:mrow><mml:msub><mml:mrow><mml:mi>A</mml:mi><mml:mi>v</mml:mi><mml:mi>g</mml:mi></mml:mrow><mml:mrow><mml:mi>n</mml:mi><mml:mi>e</mml:mi><mml:mi>g</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mfrac><mml:mspace width="0.25em"/><mml:mi>i</mml:mi><mml:mi>f</mml:mi><mml:mspace width="0.25em"/><mml:msub><mml:mrow><mml:mi>A</mml:mi><mml:mi>v</mml:mi><mml:mi>g</mml:mi></mml:mrow><mml:mrow><mml:mi>p</mml:mi><mml:mi>o</mml:mi><mml:mi>s</mml:mi></mml:mrow></mml:msub><mml:mo>≥</mml:mo><mml:msub><mml:mrow><mml:mi>A</mml:mi><mml:mi>v</mml:mi><mml:mi>g</mml:mi></mml:mrow><mml:mrow><mml:mi>n</mml:mi><mml:mi>e</mml:mi><mml:mi>g</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mfrac><mml:mrow><mml:msub><mml:mrow><mml:mi>A</mml:mi><mml:mi>v</mml:mi><mml:mi>g</mml:mi></mml:mrow><mml:mrow><mml:mi>n</mml:mi><mml:mi>e</mml:mi><mml:mi>g</mml:mi></mml:mrow></mml:msub></mml:mrow><mml:mrow><mml:msub><mml:mrow><mml:mi>A</mml:mi><mml:mi>v</mml:mi><mml:mi>g</mml:mi></mml:mrow><mml:mrow><mml:mi>p</mml:mi><mml:mi>o</mml:mi><mml:mi>s</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mfrac><mml:mspace width="0.25em"/><mml:mi>i</mml:mi><mml:mi>f</mml:mi><mml:mspace width="0.25em"/><mml:msub><mml:mrow><mml:mi>A</mml:mi><mml:mi>v</mml:mi><mml:mi>g</mml:mi></mml:mrow><mml:mrow><mml:mi>n</mml:mi><mml:mi>e</mml:mi><mml:mi>g</mml:mi></mml:mrow></mml:msub><mml:mo>≥</mml:mo><mml:msub><mml:mrow><mml:mi>A</mml:mi><mml:mi>v</mml:mi><mml:mi>g</mml:mi></mml:mrow><mml:mrow><mml:mi>p</mml:mi><mml:mi>o</mml:mi><mml:mi>s</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
</mml:math>
</alternatives>
</disp-formula></p>
<p>Where <italic>Avg</italic><sub><italic>pos</italic></sub>, <italic>SD</italic><sub><italic>pos</italic></sub>, <italic>Avg</italic><sub><italic>neg</italic></sub>, <italic>SD</italic><sub><italic>neg</italic></sub> are respectively the average and standard deviation of the aggregated values for the positive and negative controls.</p>
</sec>
<sec id="sec005">
<title>Reproducibility</title>
<p>Multiple data files of various format and origins were used for the validation of the algorithms. Real-case files generated automatically by plate readers or other applications were included, along with manually created files containing randomized data. The source code includes test files used for the testing and validation of the application (<italic>tests</italic> folder). For each file, a short description of its usage and expected output is given in the Readme file present in this folder. Both in the source code and the bundled application, other files used for demonstration purposes are also included (<italic>examples</italic> folder). The files used to generate the figures and examples described in this manuscript are all available in this folder.</p>
</sec>
</sec>
<sec id="sec006">
<title>Application overview</title>
<p><italic>PlateEditor</italic> allows the creation of <italic>Areas</italic>, which can be added to the desired wells in a process referred to as tagging (<bold><xref ref-type="fig" rid="pone.0252488.g001">Fig 1</xref></bold>). Wells can be selected by drawing a selection box (or lasso) on the plate. New wells can be added to the selection by maintaining the <italic>Ctrl</italic> key pressed. Entire columns or rows can also be selected by clicking or selecting the relevant column/row headers. When different areas need to be tagged in the same well, additional <italic>Layers</italic> can be created and tagged independently to create overlaps. Each area must have a unique name identifying it, and can be of any of the following type: sample (or range), positive control or negative control. The type chosen for the area defines specific rules for the tagging and data aggregation. In particular, control areas cannot overlap with sample or range areas in the default tagging mode (strict mode). Only values for wells tagged with a control will be used by the <italic>Controls</italic> analysis tool.</p>
<fig id="pone.0252488.g001" position="float">
<object-id pub-id-type="doi">10.1371/journal.pone.0252488.g001</object-id>
<label>Fig 1</label>
<caption>
<title>Overview of <italic>PlateEditor</italic>.</title>
<p>Top: console panel, in which feedback messages are displayed. Left: menu panel, includes all the controls and options for management of the layout, creation and tagging of areas, loading of result and definition files, as well as the analysis tools. Right: main section, divided into two panels; the <italic>Layout</italic> panel on top is used to select wells and tag the Areas. The <italic>Data</italic> panel at the bottom allows visualization of the data from the selected result files as heatmaps. This figure can be reproduced using the files from the <italic>Simple</italic> example.</p>
</caption>
<graphic mimetype="image" position="float" xlink:href="info:doi/10.1371/journal.pone.0252488.g001" xlink:type="simple"/>
</fig>
<p>Ranges are specifically designed to help with repeating sequence of samples. They possess self-incrementing features and can be linked to <italic>Definitions</italic>, data files used for the resolution of the names for each index. This greatly simplifies the process of tagging as only one Area needs to be defined and tagged, instead of a multitude of them. A typical example is a plate layout for primary screening, where each individual well contains a different compound. The plate layout can be defined by tagging a single range in the relevant wells and the name resolution performed automatically through a <italic>Definition</italic> file attached to the range (see Usage examples below).</p>
<p>Data files can be attached to the layout (<italic>Results</italic>) and the values visualized in the form of 3-color heatmaps. After parsing, a column mapping step is required to indicate which columns contain the data to be visualized, referred to as <italic>Parameters</italic> (<bold><xref ref-type="fig" rid="pone.0252488.g002">Fig 2A</xref></bold>). The column containing the well name is also required, to allow binding of the data to the relevant wells. Optionally a plate name or plate index column can also be mapped, allowing the visualization of multiple plates within a single result file. For clarity results for only one plate are displayed at a time, but the user can navigate between the available plates using the <italic>Plate View</italic> control (<bold><xref ref-type="fig" rid="pone.0252488.g002">Fig 2B</xref></bold>), located under the <italic>Data</italic> panel. A pairing tool is available to synchronize the result plates with available definition plates. This allows browsing of the result plates while maintaining a link to the correct range definitions (<bold><xref ref-type="fig" rid="pone.0252488.g002">Fig 2C</xref></bold>). The user can configure the colors used for the heatmaps using a set of available templates or choosing specific colors among a list of 138. The normalization can also be tuned to use the minimum and maximum values found across all the available plates (default setting), the current plate only, or custom values entered by the user.</p>
<fig id="pone.0252488.g002" position="float">
<object-id pub-id-type="doi">10.1371/journal.pone.0252488.g002</object-id>
<label>Fig 2</label>
<caption>
<title>Parameter mapping, plate view and pairing.</title>
<p><bold>A</bold>. Overview of the parameter mapping process for a result file including 5 columns (Well, Cell count, Nuclei area, Cell area, Cell intensity). Any column name including the keyword “well” is automatically assigned to the <italic>Well ID</italic> parameter. An optional <italic>Plate ID</italic> parameter can also be mapped when relevant (multiple plates per file). At least one column should be mapped as a parameter (<italic>Import</italic>); the values for this column will be displayed as heatmap under the <italic>Data</italic> panel of <italic>PlateEditor</italic>. The first row of data is used to automatically determine if the values are numerical or textual, but the user can adjust this setting manually (<italic>Numeric</italic>). <bold>B</bold>. The <italic>Plate View</italic> control allows selection of the plate name or plate index to display for the result file currently selected. Description of the controls, from left to right: display the first plate available; display previous plate; selection of a plate directly from the drop-down list; lookup tool to search specific plate names; display the next plate; display the last plate available. <bold>C</bold>. Pairing indicates whether the selected result plate is paired with one or more definition plates. Pairing options can be adjusted by clicking the gear icon.</p>
</caption>
<graphic mimetype="image" position="float" xlink:href="info:doi/10.1371/journal.pone.0252488.g002" xlink:type="simple"/>
</fig>
<p>Three analysis tools are available for data aggregation and export. The <italic>Controls</italic> tool aggregates the values for positive and negative controls, calculates the Z-factor (Z’) / Window for all combinations of positive and negative controls available and records these values for each visited plate (<bold><xref ref-type="fig" rid="pone.0252488.g003">Fig 3</xref></bold>). The <italic>Column Analysis</italic> tool prepares columns of data with statistics (average, standard deviation, N; identical to the table in <bold><xref ref-type="fig" rid="pone.0252488.g003">Fig 3A</xref></bold>) for each unique combination of sample/range/controls/concentration available on the layout. The coefficient of variation (CV, %) can also be displayed if desired. The <italic>Grouped Analysis</italic> tool allows aggregation of data as a double-entry table, giving the user full control over what to display as Rows and Columns (<bold><xref ref-type="fig" rid="pone.0252488.g004">Fig 4</xref></bold>). For all analysis tools, individual tables can be downloaded as tab-separated text files or visualized separately in a new window, for printing or easier copy-pasting operations. All tables can also be downloaded at once as an organized zip archive containing all the individual files.</p>
<fig id="pone.0252488.g003" position="float">
<object-id pub-id-type="doi">10.1371/journal.pone.0252488.g003</object-id>
<label>Fig 3</label>
<caption>
<title/>
<p><bold>Overview of the <italic>Controls</italic> analysis tool outputs, for a layout including two positive (Inhibitor_A, Inhibitor_B) and two negative (Solvent_A, Solvent_B) controls. A</bold>. Individual values for each control are aggregated in columns, with their average and standard deviation (SD) computed. N indicates the number of values. <bold>B</bold>. Calculated Z-score (Z’) and Window for all combinations of positive and negative controls (as double-entry tables) for the plate currently selected. <bold>C</bold>. Summary values (Z’, Window) for all visited plates are aggregated in columns, with their average and standard deviation (SD) computed. N indicates the number of plates visited. Values for each positive/negative control combination are indicated in separated tables. This figure can be reproduced using the files from the <italic>Screening</italic> example.</p>
</caption>
<graphic mimetype="image" position="float" xlink:href="info:doi/10.1371/journal.pone.0252488.g003" xlink:type="simple"/>
</fig>
<fig id="pone.0252488.g004" position="float">
<object-id pub-id-type="doi">10.1371/journal.pone.0252488.g004</object-id>
<label>Fig 4</label>
<caption>
<title>Overview of the Grouped Analysis tool output, for a layout including a range (Test compounds) and multiple concentrations (μM) arranged in dose-response.</title>
<p><bold>A</bold>. For the rows, the concentration series was selected. <bold>B</bold>. For the columns, the range was selected. <bold>C</bold>. Resulting two-entry table obtained using configuration as in <bold>A</bold> and <bold>B</bold>, with the aggregation mode set on <italic>Average</italic> (in this mode, only the average value is shown). The table has 32 columns of data but was truncated here for clarity. This figure can be reproduced using the files from the <italic>DRC</italic> example.</p>
</caption>
<graphic mimetype="image" position="float" xlink:href="info:doi/10.1371/journal.pone.0252488.g004" xlink:type="simple"/>
</fig>
<p>For a more thorough description of all the functionalities of <italic>PlateEditor</italic> and their usage the reader is invited to consult the Wiki pages of the application at the following address: <ext-link ext-link-type="uri" xlink:href="https://sourceforge.net/p/plateeditor/wiki/Home" xlink:type="simple">https://sourceforge.net/p/plateeditor/wiki/Home</ext-link>.</p>
</sec>
<sec id="sec007">
<title>Technical details on key features</title>
<sec id="sec008">
<title>File streaming</title>
<p>In <italic>PlateEditor</italic> the parsed contents of data files attached to the layout, which includes both Results and Definitions files, are not stored in the memory. Although such approach would be acceptable for files of few hundreds of kilobytes (kB), memory limitations would prevent files of several megabytes (MB) or more from being successfully loaded by the web browser, leading it to stall and eventually crash. To address these issues and allow the user to work with potentially big files, a streaming approach allowing the files to be read row-by-row was implemented. The JS library <italic>PapaParse</italic> (<ext-link ext-link-type="uri" xlink:href="https://www.papaparse.com/" xlink:type="simple">https://www.papaparse.com</ext-link>) was directly available for client-side streaming of text or csv files, but no counterparts were available for spreadsheet files (in particular.xls and.xlsx). These spreadsheets can always be converted to text or csv files by the user, so that the <italic>PapaParse</italic> library is theoretically sufficient. In practice, the Microsoft Excel file format is widespread in research laboratory and usually preferred over txt or csv due to the sorting, formatting and calculation tools that it offers. It thus seemed appropriate to implement a streaming-enabled parser for these files.</p>
<p>For xlsx files (the most recent format) the data are stored as human-readable xml files in a zip archive, so that implementation of a streaming-enabled parser was relatively straightforward. The archive is first opened and metadata parsed to extract the sheet names (these information are kept in memory for later use). Blocs of xml data from the sheet to be read are then transferred to a web worker (equivalent to a separated thread) for parsing and the parsed rows sent back one by one to the main thread. On a regular desktop computer, parsing of an xlsx file of about 16 MB, corresponding to a single worksheet file of over 250,000 rows with an unzipped size of 180 MB, was completed in about 5 seconds, which we considered satisfying.</p>
<p>Older spreadsheet files (.xls) are unfriendly binary files of varying structures depending on their version. A deep dive into the file specifications was necessary (<ext-link ext-link-type="uri" xlink:href="https://docs.microsoft.com/en-us/openspecs/office_file_formats/ms-xls" xlink:type="simple">https://docs.microsoft.com/en-us/openspecs/office_file_formats/ms-xls</ext-link>), but ultimately it was possible to implement a parser that could read xls files dating from as far as 1995. A strategy similar to xlsx files was used here: a first parsing digests the structural information to extract the sheet names and byte offsets of the sheet data-streams in the file (these metadata are kept in memory to speed-up future access). The desired sheet data-stream is then transferred to a web worker, parsed and the resulting rows sent back to the main thread. With a regular desktop computer, parsing of a 17 MB file containing a single sheet of 65,536 rows (the maximum allowed for xls files) was completed in less than 3 seconds. Both spreadsheet parsers are able to extract results from formulas but will ignore dates (return them as numbers) and formatting applied to the numbers or texts.</p>
</sec>
<sec id="sec009">
<title>Column mapping</title>
<p>When attaching data files to the layout as <italic>Results</italic> or <italic>Definitions</italic>, <italic>PlateEditor</italic> allows the mapping of specified columns to a well name (<italic>Well ID</italic>) or a plate name/index (<italic>Plate ID</italic>) (<bold><xref ref-type="fig" rid="pone.0252488.g002">Fig 2A</xref></bold>). Mapping of a <italic>Well ID</italic> is required for result files but both <italic>Well ID</italic> and <italic>Plate ID</italic> are optional for definition files. Fetching of the data will differ depending on this mapping configuration. This is quite straightforward for results as the values will always be fetched at the desired well locations in the file. If a <italic>Plate ID</italic> field is provided, values for the well ID matching the desired plate name will be used. Otherwise, the number of times the desired well name occurs in the file will be used as a key to match the desired plate index. Things are more complex for <italic>Definitions</italic> due to the higher number of cases to consider. All four possible mapping configurations and the corresponding rules used to resolve the name of a given range index are summarized in <bold><xref ref-type="table" rid="pone.0252488.t001">Table 1</xref></bold>. If the name cannot be resolved, the generic name of the item is used instead: <italic>RangeName</italic> (#<italic>i</italic>), where <italic>RangeName</italic> is the name given to the range and <italic>i</italic> the index of the item in the range. For display in the Analysis tool, in cases where the range item is tagged over multiple wells, the name resolved at the first well location (<italic>i</italic>.<italic>e</italic>. well with the lowest index) will be used.</p>
<table-wrap id="pone.0252488.t001" position="float">
<object-id pub-id-type="doi">10.1371/journal.pone.0252488.t001</object-id>
<label>Table 1</label> <caption><title>Rules used for the resolution of name for a given range index from a <italic>Definition</italic> file, based on the mapping configuration.</title></caption>
<alternatives>
<graphic id="pone.0252488.t001g" mimetype="image" position="float" xlink:href="info:doi/10.1371/journal.pone.0252488.t001" xlink:type="simple"/>
<table>
<colgroup>
<col align="left" valign="middle"/>
<col align="left" valign="middle"/>
</colgroup>
<thead>
<tr>
<th align="justify">Columns mapped</th>
<th align="justify">Rules</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><bold>-</bold></td>
<td align="left">Names are fetched row-by-row, as they appear in the file. For a range with <italic>n</italic> items, fetch the name at row <italic>i</italic> + (<italic>n</italic> × <italic>j</italic>), where <italic>i</italic> is the desired range index and <italic>j</italic> the desired plate index.</td>
</tr>
<tr>
<td align="left"><bold>Well ID</bold></td>
<td align="left">Fetch the name that match the <italic>j</italic><sup>th</sup> occurrence of the well ID, where <italic>j</italic> is the desired plate index.</td>
</tr>
<tr>
<td align="left"><bold>Plate ID</bold></td>
<td align="left">Fetch the name that match the <italic>i</italic><sup>th</sup> occurrence of the plate ID, where <italic>i</italic> is the desired range index.</td>
</tr>
<tr>
<td align="left"><bold>Well ID &amp; Plate ID</bold></td>
<td align="left">Fetch the name that match the desired well ID and plate ID</td>
</tr>
</tbody>
</table>
</alternatives>
</table-wrap>
</sec>
<sec id="sec010">
<title>Customization of range numbering</title>
<p>In <italic>PlateEditor Ranges</italic> are self-incrementing <italic>Areas</italic> that can be tuned to match the desired numbering pattern. Several options are provided for automatic numbering (<bold><xref ref-type="fig" rid="pone.0252488.g005">Fig 5A</xref></bold>), giving the user the choice over the number of replicated wells per range index, the direction of the replication (Horizontal, <italic>i</italic>.<italic>e</italic>. left to right / Vertical, <italic>i</italic>.<italic>e</italic>. top to bottom) and whether Columns or Rows should be given the priority when numbering. The possible numbering outcomes for each option configuration is shown in <bold><xref ref-type="fig" rid="pone.0252488.g005">Fig 5B</xref></bold>. For specific cases that would not be covered by these options and to give the user more flexibility, a full Custom mode is also available. In this mode, the range index is manually indicated by the user through a prompt that displays after the wells have been tagged. In particular, this allows the preparation of layouts where range items occupy blocs of wells spanning multiple rows and/or columns.</p>
<fig id="pone.0252488.g005" position="float">
<object-id pub-id-type="doi">10.1371/journal.pone.0252488.g005</object-id>
<label>Fig 5</label>
<caption>
<title>Customization of range numbering.</title>
<p><bold>A</bold>. Options available for the automatic numbering of Ranges. <bold>B</bold>. Possible numbering outcomes for each available Direction / Priority configuration, for a range of 3 replicates tagged in a bloc of 6×6 wells. A schematic indicating the numbering strategy for the four first range items is shown. Arrows indicate the 3 replicated wells of each range item.</p>
</caption>
<graphic mimetype="image" position="float" xlink:href="info:doi/10.1371/journal.pone.0252488.g005" xlink:type="simple"/>
</fig>
</sec>
</sec>
<sec id="sec011">
<title>Plate layout examples</title>
<sec id="sec012">
<title>Primary screening</title>
<p>A layout for primary screening in 96-well plate can be created on a single layer, using 3 Areas: a range with one replicate that will represent the compounds, as well as a positive and a negative control (inhibitor and solvent, respectively. <bold><xref ref-type="fig" rid="pone.0252488.g006">Fig 6A</xref></bold>). The compound names can be resolved using a definition file attached to the range. A single result file holding well values for multiple plates can be attached as well. Result and definition plates can be paired by name using the auto-pairing option, which will allow them to remain synchronized. Values can be visualized for each plate in the form of heatmaps, making it simple to identify potential hit compounds. The <italic>Controls</italic> analysis tool will allow a rapid inspection of the Z-factor (Z’) for each plate. This example can be reproduced using the files available in the <italic>Screening2</italic> folder within the <italic>Example</italic> folder (the layout, definition and result files are included).</p>
<fig id="pone.0252488.g006" position="float">
<object-id pub-id-type="doi">10.1371/journal.pone.0252488.g006</object-id>
<label>Fig 6</label>
<caption>
<title>Plate layout examples.</title>
<p><bold>A</bold>. Example of layout for primary screening, defined on a single layer with a range (blue), a negative (green) and a positive (red) control. The list of Areas defined is shown on the right. <bold>B</bold>. Example of layout for a dose-response experiment. A single range with 10 replicates is sufficient here, along with concentrations data set using the configuration shown on the right. <bold>C</bold>. Combination experiment where 2 different type of cells (Layer 1, blue and green) are infected with 2 different virus strains (Layer 2, pink and purple) at 2 different multiplicity of infection (MOI, 5 and 20). <italic>PlateEditor</italic> automatically computes the 8 unique combinations when performing the data aggregation.</p>
</caption>
<graphic mimetype="image" position="float" xlink:href="info:doi/10.1371/journal.pone.0252488.g006" xlink:type="simple"/>
</fig>
</sec>
<sec id="sec013">
<title>Dose-response curves</title>
<p>In this example a batch of 6 compounds needs to be assessed by dose-response using a 96-well plate. The dose-response curve (DRC) should start with a 20 μM top concentration and contain 10 doses, with 2-fold dilutions between each doses. Preparation of the layout is straightforward: a single range with 10 replicates and its Direction and Priority properties set to their default value (Horizontal / Row) is first created, then tagged in the relevant wells. Using the same well selection a dose-response can be tagged automatically with the desired parameters, using the configuration as shown in <bold><xref ref-type="fig" rid="pone.0252488.g006">Fig 6B</xref></bold>. After binding of a result file, the <italic>Grouped Analysis</italic> tool can be configured with the concentration data (μM) as rows and the range as columns to display the desired dose-response table (as in <bold><xref ref-type="fig" rid="pone.0252488.g004">Fig 4</xref></bold>). A definition file can also be attached to the range in order to resolve the name of each compound. This example can be reproduced using the files available in the <italic>DRC2</italic> folder within the <italic>Example</italic> folder (the layout, definition and result files are included).</p>
</sec>
<sec id="sec014">
<title>Infection experiment (combinations)</title>
<p>In this example, two different cell types (CellA, CellB) should be engaged in viral infection experiments with two different viral strains (VirusA, VirusB) at two different multiplicity of infection (MOI, 5 and 20). Altogether 8 unique conditions should be tested (2 cells × 2 virus × 2 MOIs). Such layout can be prepared effortlessly by defining only 4 areas (2 for each cells and viruses) tagged on two independent layers (<bold><xref ref-type="fig" rid="pone.0252488.g006">Fig 6C</xref></bold>). MOI data can be added on the virus layer using the single concentration tagging tool to complete the layout. After binding of a result file, the <italic>Column Analysis</italic> tool will list automatically all the unique cell/virus/MOI combinations with their aggregated values and statistical summaries. This example can be reproduced using the files available in the <italic>Infection</italic> folder within the <italic>Example</italic> folder (the layout, definition and result files are included).</p>
</sec>
</sec>
<sec id="sec015" sec-type="conclusions">
<title>Discussion</title>
<sec id="sec016">
<title>Strength</title>
<p>From the start, <italic>PlateEditor</italic> was envisioned as a free in-browser solution allowing researchers to quickly design plate layouts and safely analyze their data from any computer. The strength of a web-based application is its broad availability and speed of deployment: users just need to connect to the web-page to enjoy the latest version and improvements without the need of regularly downloading and installing updates, which quickly becomes cumbersome when working with multiple computers. Such strategy is currently also adopted by technology companies (for example Google), which are delivering more and more common applications and tools through the web-browser. This allows users to work with multiple applications using a single software that is ubiquitous in all communication devices, from computers to smart-phones, including laptops and tablets. In our approach, we leveraged the power of JS to allow the application to run purely client-side, eliminating the constraints of uploading the data to the server for processing. This not-only reduces the time needed to access the file but also ensures complete privacy of the research data used within the application. Lastly, having no requirement for database or server connection and a minimum of dependencies, <italic>PlateEditor</italic> can easily be integrated into other workflows and software. We hope the availability of the source code will promote such usage and speed up the implementation of new features.</p>
</sec>
<sec id="sec017">
<title>Current limitations</title>
<p>Currently, <italic>PlateEditor</italic> offers only a limited support for tablets and smartphones, because the process of well selection requires drawing a selection box, which is not well supported by touchscreen device. Although all the functionalities are operational, the lack of support for this operation makes the preparation of layout tedious. The small screen size of smartphones would anyway make the use of 384-well plate layout (or bigger) quite uncomfortable, but a good usability of the application on tablets is still highly desirable. We are now considering solutions for this issue and hope to be able to implement them soon in the application. A related limitation is the lack of support for people with visual impairment. The need for well selection and the highly visual nature of the data representation and analysis using heatmaps and colors make it difficult however to implement work around.</p>
<p>Another limitation is the lack of support for writing and saving of big files by <italic>PlateEditor</italic>. The only feature currently impaired by this limitation is the <italic>Push Layout</italic> function, allowing layout data to be pushed to a result file. Since the file is generated in the memory, big files may pose an issue (browser stalling and crashing) so that this function is currently restricted to 5,000 rows. While reading is not a problem and web-browsers offer appropriate tools, access to the computer file system for writing is a clear vulnerability and is therefore restricted. Streaming client-side data in an output file is currently not possible in web-browsers without additional plugins or the use of experimental functions with limited support. To our knowledge, only one JS library currently implements such feature (StreamSaver.js, <ext-link ext-link-type="uri" xlink:href="https://github.com/jimmywarting/StreamSaver.js" xlink:type="simple">https://github.com/jimmywarting/StreamSaver.js</ext-link>) by installing a service worker online using GitHub static pages and using it to mimic a server sending the data back to the client in the form of a stream. We are currently evaluating the usefulness, safety and compatibility of this library and may add it to <italic>PlateEditor</italic> if deemed acceptable and necessary.</p>
</sec>
<sec id="sec018">
<title>Future updates planned</title>
<p>We are currently preparing additional analysis tools for <italic>PlateEditor</italic>. In particular, we are considering a tool for hits/outliers detection that could prove useful for the analysis of Primary screening data. We are also considering a tool to perform normalization using values from standard curves, in order to facilitate the treatment of data obtained from ELISA. This would further increase the usefulness and versatility of <italic>PlateEditor</italic> and warrant its implementation in more diverse workflows. In the near future, we also wish to upgrade <italic>PlateEditor</italic> with a graphical output tool that will allow the visualization of the aggregated data in graphs. Several types of graph are considered: bar graphs, dot plots and box plots (whiskers), along with basic tools to estimate the statistical significance between samples. A JS application for non-linear regression has already been deployed internally in our lab and its classes and functions will also be adapted to this graphical library when ready.</p>
</sec>
</sec>
</body>
<back>
<ack>
<p>Institut Pasteur Korea is a member of the Institut Pasteur International Network (<ext-link ext-link-type="uri" xlink:href="http://www.pasteur.fr/en/international/institut-pasteur-international-network" xlink:type="simple">http://www.pasteur.fr/en/international/institut-pasteur-international-network</ext-link>).</p>
</ack>
<ref-list>
<title>References</title>
<ref id="pone.0252488.ref001"><label>1</label><mixed-citation publication-type="journal" xlink:type="simple"><name name-style="western"><surname>Alvarsson</surname> <given-names>J</given-names></name>, <name name-style="western"><surname>Andersson</surname> <given-names>C</given-names></name>, <name name-style="western"><surname>Spjuth</surname> <given-names>O</given-names></name>, <name name-style="western"><surname>Larsson</surname> <given-names>R</given-names></name>, <name name-style="western"><surname>Wikberg</surname> <given-names>JE</given-names></name>. <article-title>Brunn: An open source laboratory information system for microplates with a graphical plate layout design process</article-title>. <source>BMC bioinformatics</source>. <year>2011</year>;<volume>12</volume>(<issue>1</issue>):<fpage>179</fpage>. <comment>doi: <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1186/1471-2105-12-179" xlink:type="simple">10.1186/1471-2105-12-179</ext-link></comment> <object-id pub-id-type="pmid">21599898</object-id></mixed-citation></ref>
<ref id="pone.0252488.ref002"><label>2</label><mixed-citation publication-type="journal" xlink:type="simple"><name name-style="western"><surname>P Mazanetz</surname> <given-names>M</given-names></name>, <name name-style="western"><surname>J Marmon</surname> <given-names>R</given-names></name>, <name name-style="western"><surname>BT Reisser</surname> <given-names>C</given-names></name>, <name name-style="western"><surname>Morao</surname> <given-names>I</given-names></name>. <article-title>Drug discovery applications for KNIME: an open source data mining platform</article-title>. <source>Current topics in medicinal chemistry</source>. <year>2012</year>;<volume>12</volume>(<issue>18</issue>):<fpage>1965</fpage>–<lpage>79</lpage>. <comment>doi: <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.2174/156802612804910331" xlink:type="simple">10.2174/156802612804910331</ext-link></comment> <object-id pub-id-type="pmid">23110532</object-id></mixed-citation></ref>
<ref id="pone.0252488.ref003"><label>3</label><mixed-citation publication-type="journal" xlink:type="simple"><name name-style="western"><surname>Sparkes</surname> <given-names>A</given-names></name>, <name name-style="western"><surname>Clare</surname> <given-names>A</given-names></name>. <article-title>AutoLabDB: a substantial open source database schema to support a high-throughput automated laboratory</article-title>. <source>Bioinformatics</source>. <year>2012</year>;<volume>28</volume>(<issue>10</issue>):<fpage>1390</fpage>–<lpage>7</lpage>. <comment>doi: <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1093/bioinformatics/bts140" xlink:type="simple">10.1093/bioinformatics/bts140</ext-link></comment> <object-id pub-id-type="pmid">22467910</object-id></mixed-citation></ref>
<ref id="pone.0252488.ref004"><label>4</label><mixed-citation publication-type="journal" xlink:type="simple"><name name-style="western"><surname>Van Rossum</surname> <given-names>T</given-names></name>, <name name-style="western"><surname>Tripp</surname> <given-names>B</given-names></name>, <name name-style="western"><surname>Daley</surname> <given-names>D</given-names></name>. <article-title>SLIMS—a user-friendly sample operations and inventory management system for genotyping labs</article-title>. <source>Bioinformatics</source>. <year>2010</year>;<volume>26</volume>(<issue>14</issue>):<fpage>1808</fpage>–<lpage>10</lpage>. <comment>doi: <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1093/bioinformatics/btq271" xlink:type="simple">10.1093/bioinformatics/btq271</ext-link></comment> <object-id pub-id-type="pmid">20513665</object-id></mixed-citation></ref>
<ref id="pone.0252488.ref005"><label>5</label><mixed-citation publication-type="journal" xlink:type="simple"><name name-style="western"><surname>Wang</surname> <given-names>CK</given-names></name>, <name name-style="western"><surname>Weeratunga</surname> <given-names>SK</given-names></name>, <name name-style="western"><surname>Pacheco</surname> <given-names>CM</given-names></name>, <name name-style="western"><surname>Hofmann</surname> <given-names>A</given-names></name>. <article-title>DMAN: a Java tool for analysis of multi-well differential scanning fluorimetry experiments</article-title>. <source>Bioinformatics</source>. <year>2012</year>;<volume>28</volume>(<issue>3</issue>):<fpage>439</fpage>–<lpage>40</lpage>. <comment>doi: <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1093/bioinformatics/btr664" xlink:type="simple">10.1093/bioinformatics/btr664</ext-link></comment> <object-id pub-id-type="pmid">22135419</object-id></mixed-citation></ref>
<ref id="pone.0252488.ref006"><label>6</label><mixed-citation publication-type="journal" xlink:type="simple"><name name-style="western"><surname>Zhang</surname> <given-names>J-H</given-names></name>, <name name-style="western"><surname>Chung</surname> <given-names>TD</given-names></name>, <name name-style="western"><surname>Oldenburg</surname> <given-names>KR</given-names></name>. <article-title>A simple statistical parameter for use in evaluation and validation of high throughput screening assays</article-title>. <source>Journal of biomolecular screening</source>. <year>1999</year>;<volume>4</volume>(<issue>2</issue>):<fpage>67</fpage>–<lpage>73</lpage>. <comment>doi: <ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1177/108705719900400206" xlink:type="simple">10.1177/108705719900400206</ext-link></comment> <object-id pub-id-type="pmid">10838414</object-id></mixed-citation></ref>
</ref-list>
</back>
</article>