CINXE.COM
Fast, Scalable, Bayesian Spike Identification for Multi-Electrode Arrays | PLOS ONE
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:dc="http://purl.org/dc/terms/" xmlns:doi="http://dx.doi.org/" lang="en" xml:lang="en" itemscope itemtype="http://schema.org/Article" class="no-js"> <head prefix="og: http://ogp.me/ns#"> <link rel="stylesheet" href="/resource/css/screen.css?79f248ebefa43b7800a14562e5049ab4"/> <!-- allows for extra head tags --> <!-- hello --> <link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Open+Sans:400,400i,600"> <link media="print" rel="stylesheet" type="text/css" href="/resource/css/print.css"/> <script type="text/javascript"> var siteUrlPrefix = "/plosone/"; </script> <script src="/resource/js/vendor/modernizr-v2.7.1.js" type="text/javascript"></script> <script src="/resource/js/vendor/detectizr.min.js" type="text/javascript"></script> <link rel="shortcut icon" href="/resource/img/favicon.ico" type="image/x-icon"/> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <link rel="canonical" href="https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0019884" /> <meta name="description" content="We present an algorithm to identify individual neural spikes observed on high-density multi-electrode arrays (MEAs). Our method can distinguish large numbers of distinct neural units, even when spikes overlap, and accounts for intrinsic variability of spikes from each unit. As MEAs grow larger, it is important to find spike-identification methods that are scalable, that is, the computational cost of spike fitting should scale well with the number of units observed. Our algorithm accomplishes this goal, and is fast, because it exploits the spatial locality of each unit and the basic biophysics of extracellular signal propagation. Human interaction plays a key role in our method; but effort is minimized and streamlined via a graphical interface. We illustrate our method on data from guinea pig retinal ganglion cells and document its performance on simulated data consisting of spikes added to experimentally measured background noise. We present several tests demonstrating that the algorithm is highly accurate: it exhibits low error rates on fits to synthetic data, low refractory violation rates, good receptive field coverage, and consistency across users." /> <meta name="citation_abstract" content="We present an algorithm to identify individual neural spikes observed on high-density multi-electrode arrays (MEAs). Our method can distinguish large numbers of distinct neural units, even when spikes overlap, and accounts for intrinsic variability of spikes from each unit. As MEAs grow larger, it is important to find spike-identification methods that are scalable, that is, the computational cost of spike fitting should scale well with the number of units observed. Our algorithm accomplishes this goal, and is fast, because it exploits the spatial locality of each unit and the basic biophysics of extracellular signal propagation. Human interaction plays a key role in our method; but effort is minimized and streamlined via a graphical interface. We illustrate our method on data from guinea pig retinal ganglion cells and document its performance on simulated data consisting of spikes added to experimentally measured background noise. We present several tests demonstrating that the algorithm is highly accurate: it exhibits low error rates on fits to synthetic data, low refractory violation rates, good receptive field coverage, and consistency across users."> <meta name="keywords" content="Action potentials,Electrode potentials,Electrodes,Gaussian noise,Covariance,Retinal ganglion cells,Algorithms,Statistical distributions" /> <meta name="citation_doi" content="10.1371/journal.pone.0019884"/> <meta name="citation_author" content="Jason S. Prentice"/> <meta name="citation_author_institution" content="Department of Physics and Astronomy, University of Pennsylvania, Philadelphia, Pennsylvania, United States of America"/> <meta name="citation_author" content="Jan Homann"/> <meta name="citation_author_institution" content="Department of Physics and Astronomy, University of Pennsylvania, Philadelphia, Pennsylvania, United States of America"/> <meta name="citation_author" content="Kristina D. Simmons"/> <meta name="citation_author_institution" content="Department of Neuroscience, University of Pennsylvania, Philadelphia, Pennsylvania, United States of America"/> <meta name="citation_author" content="Gašper Tkačik"/> <meta name="citation_author_institution" content="Department of Physics and Astronomy, University of Pennsylvania, Philadelphia, Pennsylvania, United States of America"/> <meta name="citation_author" content="Vijay Balasubramanian"/> <meta name="citation_author_institution" content="Department of Physics and Astronomy, University of Pennsylvania, Philadelphia, Pennsylvania, United States of America"/> <meta name="citation_author_institution" content="Department of Neuroscience, University of Pennsylvania, Philadelphia, Pennsylvania, United States of America"/> <meta name="citation_author" content="Philip C. Nelson"/> <meta name="citation_author_institution" content="Department of Physics and Astronomy, University of Pennsylvania, Philadelphia, Pennsylvania, United States of America"/> <meta name="citation_title" content="Fast, Scalable, Bayesian Spike Identification for Multi-Electrode Arrays"/> <meta itemprop="name" content="Fast, Scalable, Bayesian Spike Identification for Multi-Electrode Arrays"/> <meta name="citation_journal_title" content="PLOS ONE"/> <meta name="citation_journal_abbrev" content="PLOS ONE"/> <meta name="citation_date" content="Jul 20, 2011"/> <meta name="citation_firstpage" content="e19884"/> <meta name="citation_issue" content="7"/> <meta name="citation_volume" content="6"/> <meta name="citation_issn" content="1932-6203"/> <meta name="citation_publisher" content="Public Library of Science"/> <meta name="citation_pdf_url" content="https://journals.plos.org/plosone/article/file?id=10.1371/journal.pone.0019884&type=printable"> <meta name="citation_article_type" content="Research Article"> <meta name="dc.identifier" content="10.1371/journal.pone.0019884" /> <meta name="twitter:card" content="summary" /> <meta name="twitter:site" content="plosone"/> <meta name="twitter:title" content="Fast, Scalable, Bayesian Spike Identification for Multi-Electrode Arrays" /> <meta property="twitter:description" content="We present an algorithm to identify individual neural spikes observed on high-density multi-electrode arrays (MEAs). Our method can distinguish large numbers of distinct neural units, even when spikes overlap, and accounts for intrinsic variability of spikes from each unit. As MEAs grow larger, it is important to find spike-identification methods that are scalable, that is, the computational cost of spike fitting should scale well with the number of units observed. Our algorithm accomplishes this goal, and is fast, because it exploits the spatial locality of each unit and the basic biophysics of extracellular signal propagation. Human interaction plays a key role in our method; but effort is minimized and streamlined via a graphical interface. We illustrate our method on data from guinea pig retinal ganglion cells and document its performance on simulated data consisting of spikes added to experimentally measured background noise. We present several tests demonstrating that the algorithm is highly accurate: it exhibits low error rates on fits to synthetic data, low refractory violation rates, good receptive field coverage, and consistency across users." /> <meta property="twitter:image" content="https://journals.plos.org/plosone/article/figure/image?id=10.1371/journal.pone.0019884.g006&size=inline" /> <meta property="og:type" content="article" /> <meta property="og:url" content="https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0019884"/> <meta property="og:title" content="Fast, Scalable, Bayesian Spike Identification for Multi-Electrode Arrays"/> <meta property="og:description" content="We present an algorithm to identify individual neural spikes observed on high-density multi-electrode arrays (MEAs). Our method can distinguish large numbers of distinct neural units, even when spikes overlap, and accounts for intrinsic variability of spikes from each unit. As MEAs grow larger, it is important to find spike-identification methods that are scalable, that is, the computational cost of spike fitting should scale well with the number of units observed. Our algorithm accomplishes this goal, and is fast, because it exploits the spatial locality of each unit and the basic biophysics of extracellular signal propagation. Human interaction plays a key role in our method; but effort is minimized and streamlined via a graphical interface. We illustrate our method on data from guinea pig retinal ganglion cells and document its performance on simulated data consisting of spikes added to experimentally measured background noise. We present several tests demonstrating that the algorithm is highly accurate: it exhibits low error rates on fits to synthetic data, low refractory violation rates, good receptive field coverage, and consistency across users."/> <meta property="og:image" content="https://journals.plos.org/plosone/article/figure/image?id=10.1371/journal.pone.0019884.g006&size=inline"/> <meta name="citation_reference" content="citation_title=How retinal circuits optimize the transfer of visual information.;citation_author=P Sterlng;citation_journal_title=The Visual Neurosciences;citation_publication_date=2004;"/> <meta name="citation_reference" content="citation_title=Multi-neuronal signals from the retina: Acquisition and analysis.;citation_author=M Meister;citation_author=J Pine;citation_author=DA Baylor;citation_journal_title=J Neurosci Methods;citation_volume=51;citation_number=51;citation_first_page=95;citation_last_page=106;citation_publication_date=1994;"/> <meta name="citation_reference" content="citation_title=Mosaic arrangement of ganglion cell receptive fields in rabbit retina.;citation_author=S Devries;citation_author=D Baylor;citation_journal_title=J Neurophysiol;citation_volume=78;citation_number=78;citation_first_page=2048;citation_publication_date=1997;"/> <meta name="citation_reference" content="citation_title=Large-scale recording of neuronal ensembles.;citation_author=G Buzsáki;citation_journal_title=Nature Neuroscience;citation_volume=7;citation_number=7;citation_first_page=446;citation_last_page=51;citation_publication_date=2004;"/> <meta name="citation_reference" content="citation_title=Tetrodes markedly improve the reliability and yield of multiple single-unit isolation from multi-unit recordings in cat striate cortex.;citation_author=CM Gray;citation_author=PE Maldonado;citation_author=M Wilson;citation_author=B McNaughton;citation_journal_title=J Neurosci Methods;citation_volume=63;citation_number=63;citation_first_page=43;citation_last_page=54;citation_publication_date=1995;"/> <meta name="citation_reference" content="citation_title=Matching pursuits with time-frequency dictionaries.;citation_author=SG Mallat;citation_author=ZF Zhang;citation_journal_title=IEEE Transactions on Signal Processing;citation_volume=41;citation_number=41;citation_first_page=3397;citation_last_page=3415;citation_publication_date=1993;"/> <meta name="citation_reference" content="citation_title=Recording spikes from a large fraction of the ganglion cells in a retinal patch.;citation_author=R Segev;citation_author=J Goodhouse;citation_author=J Puchalla;citation_author=MJ Berry;citation_journal_title=Nature Neuroscience;citation_volume=7;citation_number=7;citation_first_page=1154;citation_last_page=61;citation_publication_date=2004;"/> <meta name="citation_reference" content="citation_title=Using noise signature to optimize spike-sorting and to assess neuronal classification quality.;citation_author=C Pouzat;citation_author=O Mazor;citation_author=G Laurent;citation_journal_title=J Neurosci Methods;citation_volume=122;citation_number=122;citation_first_page=43;citation_last_page=57;citation_publication_date=2002;"/> <meta name="citation_reference" content="citation_title=What does the eye tell the brain?: Development of a system for the large scale recording of retinal output activity.;citation_author=AM Litke;citation_author=N Bezayiff;citation_author=EJ Chichilnisky;citation_author=W Cunningham;citation_author=W Dabrowski;citation_journal_title=IEEE Trans Nucl Sci;citation_volume=51;citation_number=51;citation_first_page=1434;citation_last_page=1439;citation_publication_date=2004;"/> <meta name="citation_reference" content="citation_title=Automatic sorting of multiple unit neuronal signals in the presence of anisotropic and non-gaussian variability.;citation_author=MS Fee;citation_author=P Mitra;citation_author=D Kleinfeld;citation_journal_title=J Neurosci Methods;citation_volume=69;citation_number=69;citation_first_page=175;citation_last_page=188;citation_publication_date=1996;"/> <meta name="citation_reference" content="citation_title=OPTICS: Ordering points to identify the clustering structure.;citation_author=M Ankerst;citation_author=MM Breunig;citation_author=HP Kriegel;citation_author=J Sander;citation_journal_title=SIGMOD Rec;citation_volume=28;citation_number=28;citation_first_page=49;citation_last_page=60;citation_publication_date=1999;"/> <meta name="citation_reference" content="citation_title=Temporal interaction between single spikes and complex spike bursts in hippocampal pyramidal cells.;citation_author=KD Harris;citation_author=H Hirase;citation_author=X Leinekugel;citation_author=DA Henze;citation_author=G Buzsáki;citation_journal_title=Neuron;citation_volume=32;citation_number=32;citation_first_page=141;citation_last_page=9;citation_publication_date=2001;"/> <meta name="citation_reference" content="citation_title=Retina is structured to process an excess of darkness in natural scenes.;citation_author=C Ratliff;citation_author=B Borghuis;citation_author=Y Kao;citation_author=P Sterling;citation_author=V Balasubramanian;citation_journal_title=Proceedings of the National Academy of Sciences;citation_volume=107;citation_number=107;citation_first_page=17368;citation_publication_date=2010;"/> <meta name="citation_reference" content="citation_title=Functional asymmetries in ON and OFF ganglion cells of primate retina.;citation_author=E Chichilnisky;citation_author=R Kalmar;citation_journal_title=Journal of Neuroscience;citation_volume=22;citation_number=22;citation_first_page=2737;citation_publication_date=2002;"/> <meta name="citation_reference" content="citation_title=Alpha ganglion cells in the rabbit retina.;citation_author=L Peichl;citation_author=E Buhl;citation_author=B Boycott;citation_journal_title=The Journal of Comparative Neurology;citation_volume=263;citation_number=263;citation_first_page=25;citation_last_page=41;citation_publication_date=1987;"/> <meta name="citation_reference" content="citation_title=Alpha and delta ganglion cells in the rat retina.;citation_author=L Peichl;citation_journal_title=The Journal of Comparative Neurology;citation_volume=286;citation_number=286;citation_first_page=120;citation_last_page=139;citation_publication_date=1989;"/> <meta name="citation_reference" content="citation_title=Dendritic field size and morphology of midget and parasol ganglion cells of the human retina.;citation_author=D Dacey;citation_author=M Petersen;citation_journal_title=Proceedings of the National Academy of Sciences of the United States of America;citation_volume=89;citation_number=89;citation_first_page=9666;citation_publication_date=1992;"/> <meta name="citation_reference" content="citation_title=Morphological comparisons between outer and inner ramifying alpha cells of the albino rat retina.;citation_author=M Tauchi;citation_author=K Morigiwa;citation_author=Y Fukuda;citation_journal_title=Experimental brain research;citation_volume=88;citation_number=88;citation_first_page=67;citation_last_page=77;citation_publication_date=1992;"/> <meta name="citation_reference" content="citation_title=The neurons of the retinal ganglion cell layer of the guinea pig: Quantitative analysis of their distribution and size.;citation_author=JLM Do-Nascimento;citation_author=RSV Do-Nascimento;citation_author=BA Damasceno;citation_author=LCL Silveira;citation_journal_title=Brazilian J Med Biol Res;citation_volume=24;citation_number=24;citation_first_page=199;citation_last_page=214;citation_publication_date=1991;"/> <meta name="citation_reference" content="citation_title=Spike sorting.;citation_author=RQ Quiroga;citation_journal_title=Scholarpedia;citation_volume=2;citation_number=2;citation_first_page=3583;citation_publication_date=2007;"/> <meta name="citation_reference" content="citation_title=Bayesian modeling and classification of neural signals.;citation_author=MS Lewicki;citation_journal_title=Neural computation;citation_volume=6;citation_number=6;citation_first_page=1005;citation_last_page=1030;citation_publication_date=1994;"/> <meta name="citation_reference" content="citation_title=Recognition of multiunit neural signals.;citation_author=A Atiya;citation_journal_title=IEEE Transactions on Biomedical Engineering;citation_volume=39;citation_number=39;citation_first_page=723;citation_last_page=729;citation_publication_date=1992;"/> <meta name="citation_reference" content="citation_title=Latent variable models for neural data analysis.;citation_author=M Sahani;citation_publication_date=1999;"/> <meta name="citation_reference" content="citation_title=Robust, automatic spike sorting using mixtures of multivariate t-distributions.;citation_author=S Shoham;citation_author=MR Fellows;citation_author=RA Normann;citation_journal_title=J Neurosci Methods;citation_volume=127;citation_number=127;citation_first_page=111;citation_last_page=22;citation_publication_date=2003;"/> <meta name="citation_reference" content="citation_title=Weak pairwise correlations imply strongly correlated network states in a neural population.;citation_author=E Schneidman;citation_author=MJ Berry;citation_author=R Segev;citation_author=W Bialek;citation_journal_title=Nature;citation_volume=440;citation_number=440;citation_first_page=1007;citation_last_page=12;citation_publication_date=2006;"/> <meta name="citation_reference" content="citation_title=Traditional waveform based spike sorting yields biased rate code estimates.;citation_author=V Ventura;citation_journal_title=Proc Natl Acad Sci USA;citation_volume=106;citation_number=106;citation_first_page=6921;citation_last_page=6;citation_publication_date=2009;"/> <meta name="citation_reference" content="citation_title=A review of methods for spike sorting: The detection and classification of neural action potentials.;citation_author=MS Lewicki;citation_journal_title=Network (Bristol, England);citation_volume=9;citation_number=9;citation_first_page=R53;citation_last_page=78;citation_publication_date=1998;"/> <meta name="citation_reference" content="citation_title=Spatio-temporal correlations and visual signalling in a complete neuronal population.;citation_author=JW Pillow;citation_author=J Shlens;citation_author=L Paninski;citation_author=A Sher;citation_author=AM Litke;citation_journal_title=Nature;citation_volume=454;citation_number=454;citation_first_page=995;citation_last_page=999;citation_publication_date=2008;"/> <meta name="citation_reference" content="citation_title=Optimal population coding by noisy spiking neurons.;citation_author=G Tkaficik;citation_author=J Prentice;citation_author=V Balasubramanian;citation_author=E Schneidman;citation_journal_title=Proceedings of the National Academy of Sciences;citation_volume=107;citation_number=107;citation_first_page=14419;citation_publication_date=2010;"/> <!-- DoubleClick overall ad setup script --> <script type='text/javascript'> var googletag = googletag || {}; googletag.cmd = googletag.cmd || []; (function() { var gads = document.createElement('script'); gads.async = true; gads.type = 'text/javascript'; var useSSL = 'https:' == document.location.protocol; gads.src = (useSSL ? 'https:' : 'http:') + '//www.googletagservices.com/tag/js/gpt.js'; var node = document.getElementsByTagName('script')[0]; node.parentNode.insertBefore(gads, node); })(); </script> <!-- DoubleClick ad slot setup script --> <script id="doubleClickSetupScript" type='text/javascript'> googletag.cmd.push(function() { googletag.defineSlot('/75507958/PONE_728x90_ATF', [728, 90], 'div-gpt-ad-1458247671871-0').addService(googletag.pubads()); googletag.defineSlot('/75507958/PONE_160x600_BTF', [160, 600], 'div-gpt-ad-1458247671871-1').addService(googletag.pubads()); var personalizedAds = window.plosCookieConsent && window.plosCookieConsent.hasConsented('advertising'); googletag.pubads().setRequestNonPersonalizedAds(personalizedAds ? 0 : 1); googletag.pubads().enableSingleRequest(); googletag.enableServices(); }); </script> <script type="text/javascript"> var WombatConfig = WombatConfig || {}; WombatConfig.journalKey = "PLoSONE"; WombatConfig.journalName = "PLOS ONE"; WombatConfig.figurePath = "/plosone/article/figure/image"; WombatConfig.figShareInstitutionString = "plos"; WombatConfig.doiResolverPrefix = "https://dx.plos.org/"; </script> <script type="text/javascript"> var WombatConfig = WombatConfig || {}; WombatConfig.metrics = WombatConfig.metrics || {}; WombatConfig.metrics.referenceUrl = "http://lagotto.io/plos"; WombatConfig.metrics.googleScholarUrl = "https://scholar.google.com/scholar"; WombatConfig.metrics.googleScholarCitationUrl = WombatConfig.metrics.googleScholarUrl + "?hl=en&lr=&q="; WombatConfig.metrics.crossrefUrl = "https://www.crossref.org"; </script> <script defer="defer" src="/resource/js/defer.js?13928eb59791c3cc61cf"></script><script src="/resource/js/sync.js?13928eb59791c3cc61cf"></script> <script src="/resource/js/vendor/jquery.min.js" type="text/javascript"></script> <script type="text/javascript" src="https://widgets.figshare.com/static/figshare.js"></script> <script src="/resource/js/vendor/fastclick/lib/fastclick.js" type="text/javascript"></script> <script src="/resource/js/vendor/foundation/foundation.js" type="text/javascript"></script> <script src="/resource/js/vendor/underscore-min.js" type="text/javascript"></script> <script src="/resource/js/vendor/underscore.string.min.js" type="text/javascript"></script> <script src="/resource/js/vendor/moment.js" type="text/javascript"></script> <script src="/resource/js/vendor/jquery-ui-effects.min.js" type="text/javascript"></script> <script src="/resource/js/vendor/foundation/foundation.tooltip.js" type="text/javascript"></script> <script src="/resource/js/vendor/foundation/foundation.dropdown.js" type="text/javascript"></script> <script src="/resource/js/vendor/foundation/foundation.tab.js" type="text/javascript"></script> <script src="/resource/js/vendor/foundation/foundation.reveal.js" type="text/javascript"></script> <script src="/resource/js/vendor/foundation/foundation.slider.js" type="text/javascript"></script> <script src="/resource/js/util/utils.js" type="text/javascript"></script> <script src="/resource/js/components/toggle.js" type="text/javascript"></script> <script src="/resource/js/components/truncate_elem.js" type="text/javascript"></script> <script src="/resource/js/components/tooltip_hover.js" type="text/javascript"></script> <script src="/resource/js/vendor/jquery.dotdotdot.js" type="text/javascript"></script> <!--For Google Tag manager to be able to track site information --> <script> dataLayer = [{ 'mobileSite': 'false', 'desktopSite': 'true' }]; </script> <title>Fast, Scalable, Bayesian Spike Identification for Multi-Electrode Arrays | PLOS ONE</title> </head> <body class="article plosone"> <!-- Google Tag Manager --> <noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-TP26BH" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <script> (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-TP26BH'); </script> <noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-MQQMGF" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-MQQMGF');</script> <!-- End Google Tag Manager --> <!-- New Relic --> <script type="text/javascript"> ;window.NREUM||(NREUM={});NREUM.init={distributed_tracing:{enabled:true},privacy:{cookies_enabled:true},ajax:{deny_list:["bam.nr-data.net"]}}; window.NREUM||(NREUM={}),__nr_require=function(t,e,n){function r(n){if(!e[n]){var o=e[n]={exports:{}};t[n][0].call(o.exports,function(e){var o=t[n][1][e];return r(o||e)},o,o.exports)}return e[n].exports}if("function"==typeof __nr_require)return __nr_require;for(var o=0;o<n.length;o++)r(n[o]);return r}({1:[function(t,e,n){function r(t){try{s.console&&console.log(t)}catch(e){}}var o,i=t("ee"),a=t(32),s={};try{o=localStorage.getItem("__nr_flags").split(","),console&&"function"==typeof console.log&&(s.console=!0,o.indexOf("dev")!==-1&&(s.dev=!0),o.indexOf("nr_dev")!==-1&&(s.nrDev=!0))}catch(c){}s.nrDev&&i.on("internal-error",function(t){r(t.stack)}),s.dev&&i.on("fn-err",function(t,e,n){r(n.stack)}),s.dev&&(r("NR AGENT IN DEVELOPMENT MODE"),r("flags: "+a(s,function(t,e){return t}).join(", ")))},{}],2:[function(t,e,n){function r(t,e,n,r,s){try{l?l-=1:o(s||new UncaughtException(t,e,n),!0)}catch(f){try{i("ierr",[f,c.now(),!0])}catch(d){}}return"function"==typeof u&&u.apply(this,a(arguments))}function UncaughtException(t,e,n){this.message=t||"Uncaught error with no additional information",this.sourceURL=e,this.line=n}function o(t,e){var n=e?null:c.now();i("err",[t,n])}var i=t("handle"),a=t(33),s=t("ee"),c=t("loader"),f=t("gos"),u=window.onerror,d=!1,p="nr@seenError";if(!c.disabled){var l=0;c.features.err=!0,t(1),window.onerror=r;try{throw new Error}catch(h){"stack"in h&&(t(14),t(13),"addEventListener"in window&&t(7),c.xhrWrappable&&t(15),d=!0)}s.on("fn-start",function(t,e,n){d&&(l+=1)}),s.on("fn-err",function(t,e,n){d&&!n[p]&&(f(n,p,function(){return!0}),this.thrown=!0,o(n))}),s.on("fn-end",function(){d&&!this.thrown&&l>0&&(l-=1)}),s.on("internal-error",function(t){i("ierr",[t,c.now(),!0])})}},{}],3:[function(t,e,n){var r=t("loader");r.disabled||(r.features.ins=!0)},{}],4:[function(t,e,n){function r(){U++,L=g.hash,this[u]=y.now()}function o(){U--,g.hash!==L&&i(0,!0);var t=y.now();this[h]=~~this[h]+t-this[u],this[d]=t}function i(t,e){E.emit("newURL",[""+g,e])}function a(t,e){t.on(e,function(){this[e]=y.now()})}var s="-start",c="-end",f="-body",u="fn"+s,d="fn"+c,p="cb"+s,l="cb"+c,h="jsTime",m="fetch",v="addEventListener",w=window,g=w.location,y=t("loader");if(w[v]&&y.xhrWrappable&&!y.disabled){var x=t(11),b=t(12),E=t(9),R=t(7),O=t(14),T=t(8),P=t(15),S=t(10),M=t("ee"),N=M.get("tracer"),C=t(23);t(17),y.features.spa=!0;var L,U=0;M.on(u,r),b.on(p,r),S.on(p,r),M.on(d,o),b.on(l,o),S.on(l,o),M.buffer([u,d,"xhr-resolved"]),R.buffer([u]),O.buffer(["setTimeout"+c,"clearTimeout"+s,u]),P.buffer([u,"new-xhr","send-xhr"+s]),T.buffer([m+s,m+"-done",m+f+s,m+f+c]),E.buffer(["newURL"]),x.buffer([u]),b.buffer(["propagate",p,l,"executor-err","resolve"+s]),N.buffer([u,"no-"+u]),S.buffer(["new-jsonp","cb-start","jsonp-error","jsonp-end"]),a(T,m+s),a(T,m+"-done"),a(S,"new-jsonp"),a(S,"jsonp-end"),a(S,"cb-start"),E.on("pushState-end",i),E.on("replaceState-end",i),w[v]("hashchange",i,C(!0)),w[v]("load",i,C(!0)),w[v]("popstate",function(){i(0,U>1)},C(!0))}},{}],5:[function(t,e,n){function r(){var t=new PerformanceObserver(function(t,e){var n=t.getEntries();s(v,[n])});try{t.observe({entryTypes:["resource"]})}catch(e){}}function o(t){if(s(v,[window.performance.getEntriesByType(w)]),window.performance["c"+p])try{window.performance[h](m,o,!1)}catch(t){}else try{window.performance[h]("webkit"+m,o,!1)}catch(t){}}function i(t){}if(window.performance&&window.performance.timing&&window.performance.getEntriesByType){var a=t("ee"),s=t("handle"),c=t(14),f=t(13),u=t(6),d=t(23),p="learResourceTimings",l="addEventListener",h="removeEventListener",m="resourcetimingbufferfull",v="bstResource",w="resource",g="-start",y="-end",x="fn"+g,b="fn"+y,E="bstTimer",R="pushState",O=t("loader");if(!O.disabled){O.features.stn=!0,t(9),"addEventListener"in window&&t(7);var T=NREUM.o.EV;a.on(x,function(t,e){var n=t[0];n instanceof T&&(this.bstStart=O.now())}),a.on(b,function(t,e){var n=t[0];n instanceof T&&s("bst",[n,e,this.bstStart,O.now()])}),c.on(x,function(t,e,n){this.bstStart=O.now(),this.bstType=n}),c.on(b,function(t,e){s(E,[e,this.bstStart,O.now(),this.bstType])}),f.on(x,function(){this.bstStart=O.now()}),f.on(b,function(t,e){s(E,[e,this.bstStart,O.now(),"requestAnimationFrame"])}),a.on(R+g,function(t){this.time=O.now(),this.startPath=location.pathname+location.hash}),a.on(R+y,function(t){s("bstHist",[location.pathname+location.hash,this.startPath,this.time])}),u()?(s(v,[window.performance.getEntriesByType("resource")]),r()):l in window.performance&&(window.performance["c"+p]?window.performance[l](m,o,d(!1)):window.performance[l]("webkit"+m,o,d(!1))),document[l]("scroll",i,d(!1)),document[l]("keypress",i,d(!1)),document[l]("click",i,d(!1))}}},{}],6:[function(t,e,n){e.exports=function(){return"PerformanceObserver"in window&&"function"==typeof window.PerformanceObserver}},{}],7:[function(t,e,n){function r(t){for(var e=t;e&&!e.hasOwnProperty(u);)e=Object.getPrototypeOf(e);e&&o(e)}function o(t){s.inPlace(t,[u,d],"-",i)}function i(t,e){return t[1]}var a=t("ee").get("events"),s=t("wrap-function")(a,!0),c=t("gos"),f=XMLHttpRequest,u="addEventListener",d="removeEventListener";e.exports=a,"getPrototypeOf"in Object?(r(document),r(window),r(f.prototype)):f.prototype.hasOwnProperty(u)&&(o(window),o(f.prototype)),a.on(u+"-start",function(t,e){var n=t[1];if(null!==n&&("function"==typeof n||"object"==typeof n)){var r=c(n,"nr@wrapped",function(){function t(){if("function"==typeof n.handleEvent)return n.handleEvent.apply(n,arguments)}var e={object:t,"function":n}[typeof n];return e?s(e,"fn-",null,e.name||"anonymous"):n});this.wrapped=t[1]=r}}),a.on(d+"-start",function(t){t[1]=this.wrapped||t[1]})},{}],8:[function(t,e,n){function r(t,e,n){var r=t[e];"function"==typeof r&&(t[e]=function(){var t=i(arguments),e={};o.emit(n+"before-start",[t],e);var a;e[m]&&e[m].dt&&(a=e[m].dt);var s=r.apply(this,t);return o.emit(n+"start",[t,a],s),s.then(function(t){return o.emit(n+"end",[null,t],s),t},function(t){throw o.emit(n+"end",[t],s),t})})}var o=t("ee").get("fetch"),i=t(33),a=t(32);e.exports=o;var s=window,c="fetch-",f=c+"body-",u=["arrayBuffer","blob","json","text","formData"],d=s.Request,p=s.Response,l=s.fetch,h="prototype",m="nr@context";d&&p&&l&&(a(u,function(t,e){r(d[h],e,f),r(p[h],e,f)}),r(s,"fetch",c),o.on(c+"end",function(t,e){var n=this;if(e){var r=e.headers.get("content-length");null!==r&&(n.rxSize=r),o.emit(c+"done",[null,e],n)}else o.emit(c+"done",[t],n)}))},{}],9:[function(t,e,n){var r=t("ee").get("history"),o=t("wrap-function")(r);e.exports=r;var i=window.history&&window.history.constructor&&window.history.constructor.prototype,a=window.history;i&&i.pushState&&i.replaceState&&(a=i),o.inPlace(a,["pushState","replaceState"],"-")},{}],10:[function(t,e,n){function r(t){function e(){f.emit("jsonp-end",[],l),t.removeEventListener("load",e,c(!1)),t.removeEventListener("error",n,c(!1))}function n(){f.emit("jsonp-error",[],l),f.emit("jsonp-end",[],l),t.removeEventListener("load",e,c(!1)),t.removeEventListener("error",n,c(!1))}var r=t&&"string"==typeof t.nodeName&&"script"===t.nodeName.toLowerCase();if(r){var o="function"==typeof t.addEventListener;if(o){var a=i(t.src);if(a){var d=s(a),p="function"==typeof d.parent[d.key];if(p){var l={};u.inPlace(d.parent,[d.key],"cb-",l),t.addEventListener("load",e,c(!1)),t.addEventListener("error",n,c(!1)),f.emit("new-jsonp",[t.src],l)}}}}}function o(){return"addEventListener"in window}function i(t){var e=t.match(d);return e?e[1]:null}function a(t,e){var n=t.match(l),r=n[1],o=n[3];return o?a(o,e[r]):e[r]}function s(t){var e=t.match(p);return e&&e.length>=3?{key:e[2],parent:a(e[1],window)}:{key:t,parent:window}}var c=t(23),f=t("ee").get("jsonp"),u=t("wrap-function")(f);if(e.exports=f,o()){var d=/[?&](?:callback|cb)=([^&#]+)/,p=/(.*)\.([^.]+)/,l=/^(\w+)(\.|$)(.*)$/,h=["appendChild","insertBefore","replaceChild"];Node&&Node.prototype&&Node.prototype.appendChild?u.inPlace(Node.prototype,h,"dom-"):(u.inPlace(HTMLElement.prototype,h,"dom-"),u.inPlace(HTMLHeadElement.prototype,h,"dom-"),u.inPlace(HTMLBodyElement.prototype,h,"dom-")),f.on("dom-start",function(t){r(t[0])})}},{}],11:[function(t,e,n){var r=t("ee").get("mutation"),o=t("wrap-function")(r),i=NREUM.o.MO;e.exports=r,i&&(window.MutationObserver=function(t){return this instanceof i?new i(o(t,"fn-")):i.apply(this,arguments)},MutationObserver.prototype=i.prototype)},{}],12:[function(t,e,n){function r(t){var e=i.context(),n=s(t,"executor-",e,null,!1),r=new f(n);return i.context(r).getCtx=function(){return e},r}var o=t("wrap-function"),i=t("ee").get("promise"),a=t("ee").getOrSetContext,s=o(i),c=t(32),f=NREUM.o.PR;e.exports=i,f&&(window.Promise=r,["all","race"].forEach(function(t){var e=f[t];f[t]=function(n){function r(t){return function(){i.emit("propagate",[null,!o],a,!1,!1),o=o||!t}}var o=!1;c(n,function(e,n){Promise.resolve(n).then(r("all"===t),r(!1))});var a=e.apply(f,arguments),s=f.resolve(a);return s}}),["resolve","reject"].forEach(function(t){var e=f[t];f[t]=function(t){var n=e.apply(f,arguments);return t!==n&&i.emit("propagate",[t,!0],n,!1,!1),n}}),f.prototype["catch"]=function(t){return this.then(null,t)},f.prototype=Object.create(f.prototype,{constructor:{value:r}}),c(Object.getOwnPropertyNames(f),function(t,e){try{r[e]=f[e]}catch(n){}}),o.wrapInPlace(f.prototype,"then",function(t){return function(){var e=this,n=o.argsToArray.apply(this,arguments),r=a(e);r.promise=e,n[0]=s(n[0],"cb-",r,null,!1),n[1]=s(n[1],"cb-",r,null,!1);var c=t.apply(this,n);return r.nextPromise=c,i.emit("propagate",[e,!0],c,!1,!1),c}}),i.on("executor-start",function(t){t[0]=s(t[0],"resolve-",this,null,!1),t[1]=s(t[1],"resolve-",this,null,!1)}),i.on("executor-err",function(t,e,n){t[1](n)}),i.on("cb-end",function(t,e,n){i.emit("propagate",[n,!0],this.nextPromise,!1,!1)}),i.on("propagate",function(t,e,n){this.getCtx&&!e||(this.getCtx=function(){if(t instanceof Promise)var e=i.context(t);return e&&e.getCtx?e.getCtx():this})}),r.toString=function(){return""+f})},{}],13:[function(t,e,n){var r=t("ee").get("raf"),o=t("wrap-function")(r),i="equestAnimationFrame";e.exports=r,o.inPlace(window,["r"+i,"mozR"+i,"webkitR"+i,"msR"+i],"raf-"),r.on("raf-start",function(t){t[0]=o(t[0],"fn-")})},{}],14:[function(t,e,n){function r(t,e,n){t[0]=a(t[0],"fn-",null,n)}function o(t,e,n){this.method=n,this.timerDuration=isNaN(t[1])?0:+t[1],t[0]=a(t[0],"fn-",this,n)}var i=t("ee").get("timer"),a=t("wrap-function")(i),s="setTimeout",c="setInterval",f="clearTimeout",u="-start",d="-";e.exports=i,a.inPlace(window,[s,"setImmediate"],s+d),a.inPlace(window,[c],c+d),a.inPlace(window,[f,"clearImmediate"],f+d),i.on(c+u,r),i.on(s+u,o)},{}],15:[function(t,e,n){function r(t,e){d.inPlace(e,["onreadystatechange"],"fn-",s)}function o(){var t=this,e=u.context(t);t.readyState>3&&!e.resolved&&(e.resolved=!0,u.emit("xhr-resolved",[],t)),d.inPlace(t,y,"fn-",s)}function i(t){x.push(t),m&&(E?E.then(a):w?w(a):(R=-R,O.data=R))}function a(){for(var t=0;t<x.length;t++)r([],x[t]);x.length&&(x=[])}function s(t,e){return e}function c(t,e){for(var n in t)e[n]=t[n];return e}t(7);var f=t("ee"),u=f.get("xhr"),d=t("wrap-function")(u),p=t(23),l=NREUM.o,h=l.XHR,m=l.MO,v=l.PR,w=l.SI,g="readystatechange",y=["onload","onerror","onabort","onloadstart","onloadend","onprogress","ontimeout"],x=[];e.exports=u;var b=window.XMLHttpRequest=function(t){var e=new h(t);try{u.emit("new-xhr",[e],e),e.addEventListener(g,o,p(!1))}catch(n){try{u.emit("internal-error",[n])}catch(r){}}return e};if(c(h,b),b.prototype=h.prototype,d.inPlace(b.prototype,["open","send"],"-xhr-",s),u.on("send-xhr-start",function(t,e){r(t,e),i(e)}),u.on("open-xhr-start",r),m){var E=v&&v.resolve();if(!w&&!v){var R=1,O=document.createTextNode(R);new m(a).observe(O,{characterData:!0})}}else f.on("fn-end",function(t){t[0]&&t[0].type===g||a()})},{}],16:[function(t,e,n){function r(t){if(!s(t))return null;var e=window.NREUM;if(!e.loader_config)return null;var n=(e.loader_config.accountID||"").toString()||null,r=(e.loader_config.agentID||"").toString()||null,f=(e.loader_config.trustKey||"").toString()||null;if(!n||!r)return null;var h=l.generateSpanId(),m=l.generateTraceId(),v=Date.now(),w={spanId:h,traceId:m,timestamp:v};return(t.sameOrigin||c(t)&&p())&&(w.traceContextParentHeader=o(h,m),w.traceContextStateHeader=i(h,v,n,r,f)),(t.sameOrigin&&!u()||!t.sameOrigin&&c(t)&&d())&&(w.newrelicHeader=a(h,m,v,n,r,f)),w}function o(t,e){return"00-"+e+"-"+t+"-01"}function i(t,e,n,r,o){var i=0,a="",s=1,c="",f="";return o+"@nr="+i+"-"+s+"-"+n+"-"+r+"-"+t+"-"+a+"-"+c+"-"+f+"-"+e}function a(t,e,n,r,o,i){var a="btoa"in window&&"function"==typeof window.btoa;if(!a)return null;var s={v:[0,1],d:{ty:"Browser",ac:r,ap:o,id:t,tr:e,ti:n}};return i&&r!==i&&(s.d.tk=i),btoa(JSON.stringify(s))}function s(t){return f()&&c(t)}function c(t){var e=!1,n={};if("init"in NREUM&&"distributed_tracing"in NREUM.init&&(n=NREUM.init.distributed_tracing),t.sameOrigin)e=!0;else if(n.allowed_origins instanceof Array)for(var r=0;r<n.allowed_origins.length;r++){var o=h(n.allowed_origins[r]);if(t.hostname===o.hostname&&t.protocol===o.protocol&&t.port===o.port){e=!0;break}}return e}function f(){return"init"in NREUM&&"distributed_tracing"in NREUM.init&&!!NREUM.init.distributed_tracing.enabled}function u(){return"init"in NREUM&&"distributed_tracing"in NREUM.init&&!!NREUM.init.distributed_tracing.exclude_newrelic_header}function d(){return"init"in NREUM&&"distributed_tracing"in NREUM.init&&NREUM.init.distributed_tracing.cors_use_newrelic_header!==!1}function p(){return"init"in NREUM&&"distributed_tracing"in NREUM.init&&!!NREUM.init.distributed_tracing.cors_use_tracecontext_headers}var l=t(29),h=t(18);e.exports={generateTracePayload:r,shouldGenerateTrace:s}},{}],17:[function(t,e,n){function r(t){var e=this.params,n=this.metrics;if(!this.ended){this.ended=!0;for(var r=0;r<p;r++)t.removeEventListener(d[r],this.listener,!1);e.aborted||(n.duration=a.now()-this.startTime,this.loadCaptureCalled||4!==t.readyState?null==e.status&&(e.status=0):i(this,t),n.cbTime=this.cbTime,s("xhr",[e,n,this.startTime,this.endTime,"xhr"],this))}}function o(t,e){var n=c(e),r=t.params;r.hostname=n.hostname,r.port=n.port,r.protocol=n.protocol,r.host=n.hostname+":"+n.port,r.pathname=n.pathname,t.parsedOrigin=n,t.sameOrigin=n.sameOrigin}function i(t,e){t.params.status=e.status;var n=v(e,t.lastSize);if(n&&(t.metrics.rxSize=n),t.sameOrigin){var r=e.getResponseHeader("X-NewRelic-App-Data");r&&(t.params.cat=r.split(", ").pop())}t.loadCaptureCalled=!0}var a=t("loader");if(a.xhrWrappable&&!a.disabled){var s=t("handle"),c=t(18),f=t(16).generateTracePayload,u=t("ee"),d=["load","error","abort","timeout"],p=d.length,l=t("id"),h=t(24),m=t(22),v=t(19),w=t(23),g=NREUM.o.REQ,y=window.XMLHttpRequest;a.features.xhr=!0,t(15),t(8),u.on("new-xhr",function(t){var e=this;e.totalCbs=0,e.called=0,e.cbTime=0,e.end=r,e.ended=!1,e.xhrGuids={},e.lastSize=null,e.loadCaptureCalled=!1,e.params=this.params||{},e.metrics=this.metrics||{},t.addEventListener("load",function(n){i(e,t)},w(!1)),h&&(h>34||h<10)||t.addEventListener("progress",function(t){e.lastSize=t.loaded},w(!1))}),u.on("open-xhr-start",function(t){this.params={method:t[0]},o(this,t[1]),this.metrics={}}),u.on("open-xhr-end",function(t,e){"loader_config"in NREUM&&"xpid"in NREUM.loader_config&&this.sameOrigin&&e.setRequestHeader("X-NewRelic-ID",NREUM.loader_config.xpid);var n=f(this.parsedOrigin);if(n){var r=!1;n.newrelicHeader&&(e.setRequestHeader("newrelic",n.newrelicHeader),r=!0),n.traceContextParentHeader&&(e.setRequestHeader("traceparent",n.traceContextParentHeader),n.traceContextStateHeader&&e.setRequestHeader("tracestate",n.traceContextStateHeader),r=!0),r&&(this.dt=n)}}),u.on("send-xhr-start",function(t,e){var n=this.metrics,r=t[0],o=this;if(n&&r){var i=m(r);i&&(n.txSize=i)}this.startTime=a.now(),this.listener=function(t){try{"abort"!==t.type||o.loadCaptureCalled||(o.params.aborted=!0),("load"!==t.type||o.called===o.totalCbs&&(o.onloadCalled||"function"!=typeof e.onload))&&o.end(e)}catch(n){try{u.emit("internal-error",[n])}catch(r){}}};for(var s=0;s<p;s++)e.addEventListener(d[s],this.listener,w(!1))}),u.on("xhr-cb-time",function(t,e,n){this.cbTime+=t,e?this.onloadCalled=!0:this.called+=1,this.called!==this.totalCbs||!this.onloadCalled&&"function"==typeof n.onload||this.end(n)}),u.on("xhr-load-added",function(t,e){var n=""+l(t)+!!e;this.xhrGuids&&!this.xhrGuids[n]&&(this.xhrGuids[n]=!0,this.totalCbs+=1)}),u.on("xhr-load-removed",function(t,e){var n=""+l(t)+!!e;this.xhrGuids&&this.xhrGuids[n]&&(delete this.xhrGuids[n],this.totalCbs-=1)}),u.on("xhr-resolved",function(){this.endTime=a.now()}),u.on("addEventListener-end",function(t,e){e instanceof y&&"load"===t[0]&&u.emit("xhr-load-added",[t[1],t[2]],e)}),u.on("removeEventListener-end",function(t,e){e instanceof y&&"load"===t[0]&&u.emit("xhr-load-removed",[t[1],t[2]],e)}),u.on("fn-start",function(t,e,n){e instanceof y&&("onload"===n&&(this.onload=!0),("load"===(t[0]&&t[0].type)||this.onload)&&(this.xhrCbStart=a.now()))}),u.on("fn-end",function(t,e){this.xhrCbStart&&u.emit("xhr-cb-time",[a.now()-this.xhrCbStart,this.onload,e],e)}),u.on("fetch-before-start",function(t){function e(t,e){var n=!1;return e.newrelicHeader&&(t.set("newrelic",e.newrelicHeader),n=!0),e.traceContextParentHeader&&(t.set("traceparent",e.traceContextParentHeader),e.traceContextStateHeader&&t.set("tracestate",e.traceContextStateHeader),n=!0),n}var n,r=t[1]||{};"string"==typeof t[0]?n=t[0]:t[0]&&t[0].url?n=t[0].url:window.URL&&t[0]&&t[0]instanceof URL&&(n=t[0].href),n&&(this.parsedOrigin=c(n),this.sameOrigin=this.parsedOrigin.sameOrigin);var o=f(this.parsedOrigin);if(o&&(o.newrelicHeader||o.traceContextParentHeader))if("string"==typeof t[0]||window.URL&&t[0]&&t[0]instanceof URL){var i={};for(var a in r)i[a]=r[a];i.headers=new Headers(r.headers||{}),e(i.headers,o)&&(this.dt=o),t.length>1?t[1]=i:t.push(i)}else t[0]&&t[0].headers&&e(t[0].headers,o)&&(this.dt=o)}),u.on("fetch-start",function(t,e){this.params={},this.metrics={},this.startTime=a.now(),this.dt=e,t.length>=1&&(this.target=t[0]),t.length>=2&&(this.opts=t[1]);var n,r=this.opts||{},i=this.target;"string"==typeof i?n=i:"object"==typeof i&&i instanceof g?n=i.url:window.URL&&"object"==typeof i&&i instanceof URL&&(n=i.href),o(this,n);var s=(""+(i&&i instanceof g&&i.method||r.method||"GET")).toUpperCase();this.params.method=s,this.txSize=m(r.body)||0}),u.on("fetch-done",function(t,e){this.endTime=a.now(),this.params||(this.params={}),this.params.status=e?e.status:0;var n;"string"==typeof this.rxSize&&this.rxSize.length>0&&(n=+this.rxSize);var r={txSize:this.txSize,rxSize:n,duration:a.now()-this.startTime};s("xhr",[this.params,r,this.startTime,this.endTime,"fetch"],this)})}},{}],18:[function(t,e,n){var r={};e.exports=function(t){if(t in r)return r[t];var e=document.createElement("a"),n=window.location,o={};e.href=t,o.port=e.port;var i=e.href.split("://");!o.port&&i[1]&&(o.port=i[1].split("/")[0].split("@").pop().split(":")[1]),o.port&&"0"!==o.port||(o.port="https"===i[0]?"443":"80"),o.hostname=e.hostname||n.hostname,o.pathname=e.pathname,o.protocol=i[0],"/"!==o.pathname.charAt(0)&&(o.pathname="/"+o.pathname);var a=!e.protocol||":"===e.protocol||e.protocol===n.protocol,s=e.hostname===document.domain&&e.port===n.port;return o.sameOrigin=a&&(!e.hostname||s),"/"===o.pathname&&(r[t]=o),o}},{}],19:[function(t,e,n){function r(t,e){var n=t.responseType;return"json"===n&&null!==e?e:"arraybuffer"===n||"blob"===n||"json"===n?o(t.response):"text"===n||""===n||void 0===n?o(t.responseText):void 0}var o=t(22);e.exports=r},{}],20:[function(t,e,n){function r(){}function o(t,e,n,r){return function(){return u.recordSupportability("API/"+e+"/called"),i(t+e,[f.now()].concat(s(arguments)),n?null:this,r),n?void 0:this}}var i=t("handle"),a=t(32),s=t(33),c=t("ee").get("tracer"),f=t("loader"),u=t(25),d=NREUM;"undefined"==typeof window.newrelic&&(newrelic=d);var p=["setPageViewName","setCustomAttribute","setErrorHandler","finished","addToTrace","inlineHit","addRelease"],l="api-",h=l+"ixn-";a(p,function(t,e){d[e]=o(l,e,!0,"api")}),d.addPageAction=o(l,"addPageAction",!0),d.setCurrentRouteName=o(l,"routeName",!0),e.exports=newrelic,d.interaction=function(){return(new r).get()};var m=r.prototype={createTracer:function(t,e){var n={},r=this,o="function"==typeof e;return i(h+"tracer",[f.now(),t,n],r),function(){if(c.emit((o?"":"no-")+"fn-start",[f.now(),r,o],n),o)try{return e.apply(this,arguments)}catch(t){throw c.emit("fn-err",[arguments,this,t],n),t}finally{c.emit("fn-end",[f.now()],n)}}}};a("actionText,setName,setAttribute,save,ignore,onEnd,getContext,end,get".split(","),function(t,e){m[e]=o(h,e)}),newrelic.noticeError=function(t,e){"string"==typeof t&&(t=new Error(t)),u.recordSupportability("API/noticeError/called"),i("err",[t,f.now(),!1,e])}},{}],21:[function(t,e,n){function r(t){if(NREUM.init){for(var e=NREUM.init,n=t.split("."),r=0;r<n.length-1;r++)if(e=e[n[r]],"object"!=typeof e)return;return e=e[n[n.length-1]]}}e.exports={getConfiguration:r}},{}],22:[function(t,e,n){e.exports=function(t){if("string"==typeof t&&t.length)return t.length;if("object"==typeof t){if("undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer&&t.byteLength)return t.byteLength;if("undefined"!=typeof Blob&&t instanceof Blob&&t.size)return t.size;if(!("undefined"!=typeof FormData&&t instanceof FormData))try{return JSON.stringify(t).length}catch(e){return}}}},{}],23:[function(t,e,n){var r=!1;try{var o=Object.defineProperty({},"passive",{get:function(){r=!0}});window.addEventListener("testPassive",null,o),window.removeEventListener("testPassive",null,o)}catch(i){}e.exports=function(t){return r?{passive:!0,capture:!!t}:!!t}},{}],24:[function(t,e,n){var r=0,o=navigator.userAgent.match(/Firefox[\/\s](\d+\.\d+)/);o&&(r=+o[1]),e.exports=r},{}],25:[function(t,e,n){function r(t,e){var n=[a,t,{name:t},e];return i("storeMetric",n,null,"api"),n}function o(t,e){var n=[s,t,{name:t},e];return i("storeEventMetrics",n,null,"api"),n}var i=t("handle"),a="sm",s="cm";e.exports={constants:{SUPPORTABILITY_METRIC:a,CUSTOM_METRIC:s},recordSupportability:r,recordCustom:o}},{}],26:[function(t,e,n){function r(){return s.exists&&performance.now?Math.round(performance.now()):(i=Math.max((new Date).getTime(),i))-a}function o(){return i}var i=(new Date).getTime(),a=i,s=t(34);e.exports=r,e.exports.offset=a,e.exports.getLastTimestamp=o},{}],27:[function(t,e,n){function r(t){return!(!t||!t.protocol||"file:"===t.protocol)}e.exports=r},{}],28:[function(t,e,n){function r(t,e){var n=t.getEntries();n.forEach(function(t){"first-paint"===t.name?p("timing",["fp",Math.floor(t.startTime)]):"first-contentful-paint"===t.name&&p("timing",["fcp",Math.floor(t.startTime)])})}function o(t,e){var n=t.getEntries();if(n.length>0){var r=n[n.length-1];if(c&&c<r.startTime)return;p("lcp",[r])}}function i(t){t.getEntries().forEach(function(t){t.hadRecentInput||p("cls",[t])})}function a(t){if(t instanceof v&&!g){var e=Math.round(t.timeStamp),n={type:t.type};e<=l.now()?n.fid=l.now()-e:e>l.offset&&e<=Date.now()?(e-=l.offset,n.fid=l.now()-e):e=l.now(),g=!0,p("timing",["fi",e,n])}}function s(t){"hidden"===t&&(c=l.now(),p("pageHide",[c]))}if(!("init"in NREUM&&"page_view_timing"in NREUM.init&&"enabled"in NREUM.init.page_view_timing&&NREUM.init.page_view_timing.enabled===!1)){var c,f,u,d,p=t("handle"),l=t("loader"),h=t(31),m=t(23),v=NREUM.o.EV;if("PerformanceObserver"in window&&"function"==typeof window.PerformanceObserver){f=new PerformanceObserver(r);try{f.observe({entryTypes:["paint"]})}catch(w){}u=new PerformanceObserver(o);try{u.observe({entryTypes:["largest-contentful-paint"]})}catch(w){}d=new PerformanceObserver(i);try{d.observe({type:"layout-shift",buffered:!0})}catch(w){}}if("addEventListener"in document){var g=!1,y=["click","keydown","mousedown","pointerdown","touchstart"];y.forEach(function(t){document.addEventListener(t,a,m(!1))})}h(s)}},{}],29:[function(t,e,n){function r(){function t(){return e?15&e[n++]:16*Math.random()|0}var e=null,n=0,r=window.crypto||window.msCrypto;r&&r.getRandomValues&&(e=r.getRandomValues(new Uint8Array(31)));for(var o,i="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx",a="",s=0;s<i.length;s++)o=i[s],"x"===o?a+=t().toString(16):"y"===o?(o=3&t()|8,a+=o.toString(16)):a+=o;return a}function o(){return a(16)}function i(){return a(32)}function a(t){function e(){return n?15&n[r++]:16*Math.random()|0}var n=null,r=0,o=window.crypto||window.msCrypto;o&&o.getRandomValues&&Uint8Array&&(n=o.getRandomValues(new Uint8Array(31)));for(var i=[],a=0;a<t;a++)i.push(e().toString(16));return i.join("")}e.exports={generateUuid:r,generateSpanId:o,generateTraceId:i}},{}],30:[function(t,e,n){function r(t,e){if(!o)return!1;if(t!==o)return!1;if(!e)return!0;if(!i)return!1;for(var n=i.split("."),r=e.split("."),a=0;a<r.length;a++)if(r[a]!==n[a])return!1;return!0}var o=null,i=null,a=/Version\/(\S+)\s+Safari/;if(navigator.userAgent){var s=navigator.userAgent,c=s.match(a);c&&s.indexOf("Chrome")===-1&&s.indexOf("Chromium")===-1&&(o="Safari",i=c[1])}e.exports={agent:o,version:i,match:r}},{}],31:[function(t,e,n){function r(t){function e(){t(s&&document[s]?document[s]:document[i]?"hidden":"visible")}"addEventListener"in document&&a&&document.addEventListener(a,e,o(!1))}var o=t(23);e.exports=r;var i,a,s;"undefined"!=typeof document.hidden?(i="hidden",a="visibilitychange",s="visibilityState"):"undefined"!=typeof document.msHidden?(i="msHidden",a="msvisibilitychange"):"undefined"!=typeof document.webkitHidden&&(i="webkitHidden",a="webkitvisibilitychange",s="webkitVisibilityState")},{}],32:[function(t,e,n){function r(t,e){var n=[],r="",i=0;for(r in t)o.call(t,r)&&(n[i]=e(r,t[r]),i+=1);return n}var o=Object.prototype.hasOwnProperty;e.exports=r},{}],33:[function(t,e,n){function r(t,e,n){e||(e=0),"undefined"==typeof n&&(n=t?t.length:0);for(var r=-1,o=n-e||0,i=Array(o<0?0:o);++r<o;)i[r]=t[e+r];return i}e.exports=r},{}],34:[function(t,e,n){e.exports={exists:"undefined"!=typeof window.performance&&window.performance.timing&&"undefined"!=typeof window.performance.timing.navigationStart}},{}],ee:[function(t,e,n){function r(){}function o(t){function e(t){return t&&t instanceof r?t:t?f(t,c,a):a()}function n(n,r,o,i,a){if(a!==!1&&(a=!0),!l.aborted||i){t&&a&&t(n,r,o);for(var s=e(o),c=m(n),f=c.length,u=0;u<f;u++)c[u].apply(s,r);var p=d[y[n]];return p&&p.push([x,n,r,s]),s}}function i(t,e){g[t]=m(t).concat(e)}function h(t,e){var n=g[t];if(n)for(var r=0;r<n.length;r++)n[r]===e&&n.splice(r,1)}function m(t){return g[t]||[]}function v(t){return p[t]=p[t]||o(n)}function w(t,e){l.aborted||u(t,function(t,n){e=e||"feature",y[n]=e,e in d||(d[e]=[])})}var g={},y={},x={on:i,addEventListener:i,removeEventListener:h,emit:n,get:v,listeners:m,context:e,buffer:w,abort:s,aborted:!1};return x}function i(t){return f(t,c,a)}function a(){return new r}function s(){(d.api||d.feature)&&(l.aborted=!0,d=l.backlog={})}var c="nr@context",f=t("gos"),u=t(32),d={},p={},l=e.exports=o();e.exports.getOrSetContext=i,l.backlog=d},{}],gos:[function(t,e,n){function r(t,e,n){if(o.call(t,e))return t[e];var r=n();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(t,e,{value:r,writable:!0,enumerable:!1}),r}catch(i){}return t[e]=r,r}var o=Object.prototype.hasOwnProperty;e.exports=r},{}],handle:[function(t,e,n){function r(t,e,n,r){o.buffer([t],r),o.emit(t,e,n)}var o=t("ee").get("handle");e.exports=r,r.ee=o},{}],id:[function(t,e,n){function r(t){var e=typeof t;return!t||"object"!==e&&"function"!==e?-1:t===window?0:a(t,i,function(){return o++})}var o=1,i="nr@id",a=t("gos");e.exports=r},{}],loader:[function(t,e,n){function r(){if(!P++){var t=T.info=NREUM.info,e=v.getElementsByTagName("script")[0];if(setTimeout(f.abort,3e4),!(t&&t.licenseKey&&t.applicationID&&e))return f.abort();c(R,function(e,n){t[e]||(t[e]=n)});var n=a();s("mark",["onload",n+T.offset],null,"api"),s("timing",["load",n]);var r=v.createElement("script");0===t.agent.indexOf("http://")||0===t.agent.indexOf("https://")?r.src=t.agent:r.src=h+"://"+t.agent,e.parentNode.insertBefore(r,e)}}function o(){"complete"===v.readyState&&i()}function i(){s("mark",["domContent",a()+T.offset],null,"api")}var a=t(26),s=t("handle"),c=t(32),f=t("ee"),u=t(30),d=t(27),p=t(21),l=t(23),h=p.getConfiguration("ssl")===!1?"http":"https",m=window,v=m.document,w="addEventListener",g="attachEvent",y=m.XMLHttpRequest,x=y&&y.prototype,b=!d(m.location);NREUM.o={ST:setTimeout,SI:m.setImmediate,CT:clearTimeout,XHR:y,REQ:m.Request,EV:m.Event,PR:m.Promise,MO:m.MutationObserver};var E=""+location,R={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net",agent:"js-agent.newrelic.com/nr-spa-1212.min.js"},O=y&&x&&x[w]&&!/CriOS/.test(navigator.userAgent),T=e.exports={offset:a.getLastTimestamp(),now:a,origin:E,features:{},xhrWrappable:O,userAgent:u,disabled:b};if(!b){t(20),t(28),v[w]?(v[w]("DOMContentLoaded",i,l(!1)),m[w]("load",r,l(!1))):(v[g]("onreadystatechange",o),m[g]("onload",r)),s("mark",["firstbyte",a.getLastTimestamp()],null,"api");var P=0}},{}],"wrap-function":[function(t,e,n){function r(t,e){function n(e,n,r,c,f){function nrWrapper(){var i,a,u,p;try{a=this,i=d(arguments),u="function"==typeof r?r(i,a):r||{}}catch(l){o([l,"",[i,a,c],u],t)}s(n+"start",[i,a,c],u,f);try{return p=e.apply(a,i)}catch(h){throw s(n+"err",[i,a,h],u,f),h}finally{s(n+"end",[i,a,p],u,f)}}return a(e)?e:(n||(n=""),nrWrapper[p]=e,i(e,nrWrapper,t),nrWrapper)}function r(t,e,r,o,i){r||(r="");var s,c,f,u="-"===r.charAt(0);for(f=0;f<e.length;f++)c=e[f],s=t[c],a(s)||(t[c]=n(s,u?c+r:r,o,c,i))}function s(n,r,i,a){if(!h||e){var s=h;h=!0;try{t.emit(n,r,i,e,a)}catch(c){o([c,n,r,i],t)}h=s}}return t||(t=u),n.inPlace=r,n.flag=p,n}function o(t,e){e||(e=u);try{e.emit("internal-error",t)}catch(n){}}function i(t,e,n){if(Object.defineProperty&&Object.keys)try{var r=Object.keys(t);return r.forEach(function(n){Object.defineProperty(e,n,{get:function(){return t[n]},set:function(e){return t[n]=e,e}})}),e}catch(i){o([i],n)}for(var a in t)l.call(t,a)&&(e[a]=t[a]);return e}function a(t){return!(t&&t instanceof Function&&t.apply&&!t[p])}function s(t,e){var n=e(t);return n[p]=t,i(t,n,u),n}function c(t,e,n){var r=t[e];t[e]=s(r,n)}function f(){for(var t=arguments.length,e=new Array(t),n=0;n<t;++n)e[n]=arguments[n];return e}var u=t("ee"),d=t(33),p="nr@original",l=Object.prototype.hasOwnProperty,h=!1;e.exports=r,e.exports.wrapFunction=s,e.exports.wrapInPlace=c,e.exports.argsToArray=f},{}]},{},["loader",2,17,5,3,4]); ;NREUM.loader_config={accountID:"804283",trustKey:"804283",agentID:"402703674",licenseKey:"cf99e8d2a3",applicationID:"402703674"} ;NREUM.info={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net",licenseKey:"cf99e8d2a3", // Modified this value from the generated script, to pass prod vs dev applicationID: window.location.hostname.includes('journals.plos.org') ? "402703674" : "402694889", sa:1} </script> <!-- End New Relic --> <header> <div id="topslot" class="head-top"> <a id="skip-to-content" tabindex="0" class="button" href="#main-content"> Skip to main content </a> <div class="center"> <div class="title">Advertisement</div> <!-- DoubleClick Ad Zone --> <div class='advertisement' id='div-gpt-ad-1458247671871-0' style='width:728px; height:90px;'> <script type='text/javascript'> googletag.cmd.push(function() { googletag.display('div-gpt-ad-1458247671871-0'); }); </script> </div> </div> </div> <div id="user" class="nav" data-user-management-url="https://community.plos.org"> </div> <div id="pagehdr"> <nav class="nav-main"> <h1 class="logo"> <a href="/plosone/.">PLOS ONE</a> </h1> <section class="top-bar-section"> <ul class="nav-elements"> <li class="multi-col-parent menu-section-header has-dropdown" id="publish"> Publish <div class="dropdown mega "> <ul class="multi-col" id="publish-dropdown-list"> <li class="menu-section-header " id="submissions"> <span class="menu-section-header-title"> Submissions </span> <ul class="menu-section " id="submissions-dropdown-list"> <li> <a href="/plosone/s/getting-started" >Getting Started</a> </li> <li> <a href="/plosone/s/submission-guidelines" >Submission Guidelines</a> </li> <li> <a href="/plosone/s/figures" >Figures</a> </li> <li> <a href="/plosone/s/tables" >Tables</a> </li> <li> <a href="/plosone/s/supporting-information" >Supporting Information</a> </li> <li> <a href="/plosone/s/latex" >LaTeX</a> </li> <li> <a href="/plosone/s/what-we-publish" >What We Publish</a> </li> <li> <a href="/plosone/s/preprints" >Preprints</a> </li> <li> <a href="/plosone/s/revising-your-manuscript" >Revising Your Manuscript</a> </li> <li> <a href="/plosone/s/submit-now" >Submit Now</a> </li> <li> <a href="https://collections.plos.org/s/calls-for-papers" >Calls for Papers</a> </li> </ul> </li> <li class="menu-section-header " id="policies"> <span class="menu-section-header-title"> Policies </span> <ul class="menu-section " id="policies-dropdown-list"> <li> <a href="/plosone/s/best-practices-in-research-reporting" >Best Practices in Research Reporting</a> </li> <li> <a href="/plosone/s/human-subjects-research" >Human Subjects Research</a> </li> <li> <a href="/plosone/s/animal-research" >Animal Research</a> </li> <li> <a href="/plosone/s/competing-interests" >Competing Interests</a> </li> <li> <a href="/plosone/s/disclosure-of-funding-sources" >Disclosure of Funding Sources</a> </li> <li> <a href="/plosone/s/licenses-and-copyright" >Licenses and Copyright</a> </li> <li> <a href="/plosone/s/data-availability" >Data Availability</a> </li> <li> <a href="/plosone/s/complementary-research" >Complementary Research</a> </li> <li> <a href="/plosone/s/materials-software-and-code-sharing" >Materials, Software and Code Sharing</a> </li> <li> <a href="/plosone/s/ethical-publishing-practice" >Ethical Publishing Practice</a> </li> <li> <a href="/plosone/s/authorship" >Authorship</a> </li> <li> <a href="/plosone/s/corrections-expressions-of-concern-and-retractions" >Corrections, Expressions of Concern, and Retractions</a> </li> </ul> </li> <li class="menu-section-header " id="manuscript-review-and-publication"> <span class="menu-section-header-title"> Manuscript Review and Publication </span> <ul class="menu-section " id="manuscript-review-and-publication-dropdown-list"> <li> <a href="/plosone/s/criteria-for-publication" >Criteria for Publication</a> </li> <li> <a href="/plosone/s/editorial-and-peer-review-process" >Editorial and Peer Review Process</a> </li> <li> <a href="https://plos.org/resources/editor-center" >Editor Center</a> </li> <li> <a href="/plosone/s/resources-for-editors" >Resources for Editors</a> </li> <li> <a href="/plosone/s/reviewer-guidelines" >Guidelines for Reviewers</a> </li> <li> <a href="/plosone/s/accepted-manuscripts" >Accepted Manuscripts</a> </li> <li> <a href="/plosone/s/comments" >Comments</a> </li> </ul> </li> </ul> <div class="calloutcontainer"> <h3 class="callout-headline">Submit Your Manuscript</h3> <div class="action-contain"> <p class="callout-content"> Discover a faster, simpler path to publishing in a high-quality journal. <em>PLOS ONE</em> promises fair, rigorous peer review, broad scope, and wide readership – a perfect fit for your research every time. </p> <p class="button-contain special"> <a class="button button-default" href="/plosone/static/publish"> Learn More </a> <a class="button-link" href="https://www.editorialmanager.com/pone/default.asp"> Submit Now </a> </p> </div> <!-- opens in siteMenuCalloutDescription --> </div> </div> </li> <li class="menu-section-header has-dropdown " id="about"> <span class="menu-section-header-title"> About </span> <ul class="menu-section dropdown " id="about-dropdown-list"> <li> <a href="/plosone/static/publish" >Why Publish with PLOS ONE</a> </li> <li> <a href="/plosone/s/journal-information" >Journal Information</a> </li> <li> <a href="/plosone/s/staff-editors" >Staff Editors</a> </li> <li> <a href="/plosone/static/editorial-board" >Editorial Board</a> </li> <li> <a href="/plosone/s/section-editors" >Section Editors</a> </li> <li> <a href="/plosone/s/advisory-groups" >Advisory Groups</a> </li> <li> <a href="/plosone/s/find-and-read-articles" >Find and Read Articles</a> </li> <li> <a href="/plosone/s/publishing-information" >Publishing Information</a> </li> <li> <a href="https://plos.org/publication-fees" >Publication Fees</a> </li> <li> <a href="https://plos.org/press-and-media" >Press and Media</a> </li> <li> <a href="/plosone/s/contact" >Contact</a> </li> </ul> </li> <li data-js-tooltip-hover="trigger" class="subject-area menu-section-header"> Browse </li> <script src="/resource/js/vendor/jquery.hoverIntent.js" type="text/javascript"></script> <script src="/resource/js/components/menu_drop.js" type="text/javascript"></script> <script src="/resource/js/components/hover_delay.js" type="text/javascript"></script> <li id="navsearch" class="head-search"> <form name="searchForm" action="/plosone/search" method="get"> <fieldset> <legend>Search</legend> <label for="search">Search</label> <div class="search-contain"> <input id="search" type="text" name="q" placeholder="SEARCH" required/> <button id="headerSearchButton" type="submit" aria-label="Submit search"> <i title="Submit search" class="search-icon"></i> </button> </div> </fieldset> <input type="hidden" name="filterJournals" value="PLoSONE"/> </form> <a id="advSearch" href="/plosone/search"> advanced search </a> <script src="/resource/js/components/placeholder_style.js" type="text/javascript"></script> </li> </ul> </section> </nav> </div> </header> <section id="taxonomyContainer"> <script src="/resource/js/taxonomy-browser.js" type="text/javascript"></script> <div id="taxonomy-browser" class="areas" data-search-url="/plosone/browse"> <div class="wrapper"> <div class="taxonomy-header"> Browse Subject Areas <div id="subjInfo">?</div> <div id="subjInfoText"> <p>Click through the PLOS taxonomy to find articles in your field.</p> <p>For more information about PLOS Subject Areas, click <a href="https://github.com/PLOS/plos-thesaurus/blob/master/README.md" target="_blank" title="Link opens in new window">here</a>. </p> </div> </div> <div class="levels"> <div class="levels-container cf"> <div class="levels-position"></div> </div> <a href="#" class="prev"></a> <a href="#" class="next active"></a> </div> </div> <div class="taxonomy-browser-border-bottom"></div> </div> </section> <main id="main-content"> <div class="set-grid"> <header class="title-block"> <script src="/resource/js/components/signposts.js" type="text/javascript"></script> <ul id="almSignposts" class="signposts"> <li id="loadingMetrics"> <p>Loading metrics</p> </li> </ul> <script type="text/template" id="signpostsGeneralErrorTemplate"> <li id="metricsError">Article metrics are unavailable at this time. Please try again later.</li> </script> <script type="text/template" id="signpostsNewArticleErrorTemplate"> <li></li><li></li><li id="tooSoon">Article metrics are unavailable for recently published articles.</li> </script> <script type="text/template" id="signpostsTemplate"> <li id="almSaves"> <%= s.numberFormat(saveCount, 0) %> <div class="tools" data-js-tooltip-hover="trigger"> <a class="metric-term" href="/plosone/article/metrics?id=10.1371/journal.pone.0019884#savedHeader">Save</a> <p class="saves-tip" data-js-tooltip-hover="target"><a href="/plosone/article/metrics?id=10.1371/journal.pone.0019884#savedHeader">Total Mendeley and Citeulike bookmarks.</a></p> </div> </li> <li id="almCitations"> <%= s.numberFormat(citationCount, 0) %> <div class="tools" data-js-tooltip-hover="trigger"> <a class="metric-term" href="/plosone/article/metrics?id=10.1371/journal.pone.0019884#citedHeader">Citation</a> <p class="citations-tip" data-js-tooltip-hover="target"><a href="/plosone/article/metrics?id=10.1371/journal.pone.0019884#citedHeader">Paper's citation count computed by Dimensions.</a></p> </div> </li> <li id="almViews"> <%= s.numberFormat(viewCount, 0) %> <div class="tools" data-js-tooltip-hover="trigger"> <a class="metric-term" href="/plosone/article/metrics?id=10.1371/journal.pone.0019884#viewedHeader">View</a> <p class="views-tip" data-js-tooltip-hover="target"><a href="/plosone/article/metrics?id=10.1371/journal.pone.0019884#viewedHeader">PLOS views and downloads.</a></p> </div> </li> <li id="almShares"> <%= s.numberFormat(shareCount, 0) %> <div class="tools" data-js-tooltip-hover="trigger"> <a class="metric-term" href="/plosone/article/metrics?id=10.1371/journal.pone.0019884#discussedHeader">Share</a> <p class="shares-tip" data-js-tooltip-hover="target"><a href="/plosone/article/metrics?id=10.1371/journal.pone.0019884#discussedHeader">Sum of Facebook, Twitter, Reddit and Wikipedia activity.</a></p> </div> </li> </script> <div class="article-meta"> <div class="classifications"> <p class="license-short" id="licenseShort">Open Access</p> <p class="peer-reviewed" id="peerReviewed">Peer-reviewed</p> <div class="article-type" > <p class="type-article" id="artType">Research Article</p> </div> </div> </div> <div class="article-title-etc"> <div class="title-authors"> <h1 id="artTitle"><?xml version="1.0" encoding="UTF-8"?>Fast, Scalable, Bayesian Spike Identification for Multi-Electrode Arrays</h1> <ul class="author-list clearfix" data-js-tooltip="tooltip_container" id="author-list"> <li data-js-tooltip="tooltip_trigger" > <a data-author-id="0" class="author-name" > Jason S. Prentice <span class="email"> </span>,</a> <div id="author-meta-0" class="author-info" data-js-tooltip="tooltip_target"> <p id="authCorresponding-0"> <span class="email">* E-mail:</span> <a href="mailto:jprentic@sas.upenn.edu">jprentic@sas.upenn.edu</a></p> <p id="authAffiliations-0"><span class="type">Affiliation</span> Department of Physics and Astronomy, University of Pennsylvania, Philadelphia, Pennsylvania, United States of America </p> <a data-js-tooltip="tooltip_close" class="close" id="tooltipClose0"> ⨯ </a> </div> </li> <li data-js-tooltip="tooltip_trigger" > <a data-author-id="1" class="author-name" > Jan Homann,</a> <div id="author-meta-1" class="author-info" data-js-tooltip="tooltip_target"> <p id="authAffiliations-1"><span class="type">Affiliation</span> Department of Physics and Astronomy, University of Pennsylvania, Philadelphia, Pennsylvania, United States of America </p> <a data-js-tooltip="tooltip_close" class="close" id="tooltipClose1"> ⨯ </a> </div> </li> <li data-js-tooltip="tooltip_trigger" > <a data-author-id="2" class="author-name" > Kristina D. Simmons,</a> <div id="author-meta-2" class="author-info" data-js-tooltip="tooltip_target"> <p id="authAffiliations-2"><span class="type">Affiliation</span> Department of Neuroscience, University of Pennsylvania, Philadelphia, Pennsylvania, United States of America </p> <a data-js-tooltip="tooltip_close" class="close" id="tooltipClose2"> ⨯ </a> </div> </li> <li data-js-tooltip="tooltip_trigger" > <a data-author-id="3" class="author-name" > Gašper Tkačik,</a> <div id="author-meta-3" class="author-info" data-js-tooltip="tooltip_target"> <p id="authAffiliations-3"><span class="type">Affiliation</span> Department of Physics and Astronomy, University of Pennsylvania, Philadelphia, Pennsylvania, United States of America </p> <a data-js-tooltip="tooltip_close" class="close" id="tooltipClose3"> ⨯ </a> </div> </li> <li data-js-tooltip="tooltip_trigger" > <a data-author-id="4" class="author-name" > Vijay Balasubramanian,</a> <div id="author-meta-4" class="author-info" data-js-tooltip="tooltip_target"> <p id="authAffiliations-4"><span class="type">Affiliations</span> Department of Physics and Astronomy, University of Pennsylvania, Philadelphia, Pennsylvania, United States of America, Department of Neuroscience, University of Pennsylvania, Philadelphia, Pennsylvania, United States of America </p> <a data-js-tooltip="tooltip_close" class="close" id="tooltipClose4"> ⨯ </a> </div> </li> <li data-js-tooltip="tooltip_trigger" > <a data-author-id="5" class="author-name" > Philip C. Nelson</a> <div id="author-meta-5" class="author-info" data-js-tooltip="tooltip_target"> <p id="authAffiliations-5"><span class="type">Affiliation</span> Department of Physics and Astronomy, University of Pennsylvania, Philadelphia, Pennsylvania, United States of America </p> <a data-js-tooltip="tooltip_close" class="close" id="tooltipClose5"> ⨯ </a> </div> </li> </ul> <script src="/resource/js/components/tooltip.js" type="text/javascript"></script> </div> <div id="floatTitleTop" data-js-floater="title_author" class="float-title" role="presentation"> <div class="set-grid"> <div class="float-title-inner"> <h1><?xml version="1.0" encoding="UTF-8"?>Fast, Scalable, Bayesian Spike Identification for Multi-Electrode Arrays</h1> <ul id="floatAuthorList" data-js-floater="floated_authors"> <li data-float-index="1">Jason S. Prentice, </li> <li data-float-index="2">Jan Homann, </li> <li data-float-index="3">Kristina D. Simmons, </li> <li data-float-index="4">Gašper Tkačik, </li> <li data-float-index="5">Vijay Balasubramanian, </li> <li data-float-index="6">Philip C. Nelson </li> </ul> </div> <div class="logo-close" id="titleTopCloser"> <img src="/resource/img/logo-plos.png" style="height: 2em" alt="PLOS" /> <div class="close-floater" title="close">x</div> </div> </div> </div> <ul class="date-doi"> <li id="artPubDate">Published: July 20, 2011</li> <li id="artDoi"> <a href="https://doi.org/10.1371/journal.pone.0019884">https://doi.org/10.1371/journal.pone.0019884</a> </li> <li class="flex-spacer"></li> </ul> </div> <div> </div> </header> <section class="article-body"> <ul class="article-tabs"> <li class="tab-title active" id="tabArticle"> <a href="/plosone/article?id=10.1371/journal.pone.0019884" class="article-tab-1">Article</a> </li> <li class="tab-title " id="tabAuthors"> <a href="/plosone/article/authors?id=10.1371/journal.pone.0019884" class="article-tab-2">Authors</a> </li> <li class="tab-title " id="tabMetrics"> <a href="/plosone/article/metrics?id=10.1371/journal.pone.0019884" class="article-tab-3">Metrics</a> </li> <li class="tab-title " id="tabComments"> <a href="/plosone/article/comments?id=10.1371/journal.pone.0019884" class="article-tab-4">Comments</a> </li> <li class="tab-title" id="tabRelated"> <a class="article-tab-5" id="tabRelated-link">Media Coverage</a> <script>$(document).ready(function() { $.getMediaLink("10.1371/journal.pone.0019884").then(function (url) { $("#tabRelated-link").attr("href", url) } ) })</script> </li> </ul> <div class="article-container"> <div id="nav-article"> <ul class="nav-secondary"> <li class="nav-comments" id="nav-comments"> <a href="article/comments?id=10.1371/journal.pone.0019884">Reader Comments</a> </li> <li id="nav-figures"><a href="#" data-doi="10.1371/journal.pone.0019884">Figures</a></li> </ul> <div id="nav-data-linking" data-data-url=""> </div> </div> <script src="/resource/js/components/scroll.js" type="text/javascript"></script> <script src="/resource/js/components/nav_builder.js" type="text/javascript"></script> <script src="/resource/js/components/floating_nav.js" type="text/javascript"></script> <div id="figure-lightbox-container"></div> <script id="figure-lightbox-template" type="text/template"> <div id="figure-lightbox" class="reveal-modal full" data-reveal aria-hidden="true" role="dialog"> <div class="lb-header"> <h1 id="lb-title"><%= articleTitle %></h1> <div id="lb-authors"> <span>Jason S. Prentice</span> <span>Jan Homann</span> <a class="more-authors" href="/plosone/article/authors?id=10.1371/journal.pone.0019884">...</a> <span>Philip C. Nelson</span> </div> <div class="lb-close" title="close"> </div> </div> <div class="img-container"> <div class="loader"> <i class="fa-spinner"></i> </div> <img class="main-lightbox-image" src=""/> <aside id="figures-list"> <% figureList.each(function (ix, figure) { %> <div class="change-img" data-doi="<%= figure.getAttribute('data-doi') %>"> <img class="aside-figure" src="/plosone/article/figure/image?size=inline&id=<%= figure.getAttribute('data-doi') %>" /> </div> <% }) %> <div class="dummy-figure"> </div> </aside> </div> <div id="lightbox-footer"> <div id="btns-container" class="lightbox-row <% if(figureList.length <= 1) { print('one-figure-only') } %>"> <div class="fig-btns-container reset-zoom-wrapper left"> <span class="fig-btn reset-zoom-btn">Reset zoom</span> </div> <div class="zoom-slider-container"> <div class="range-slider-container"> <span id="lb-zoom-min"></span> <div class="range-slider round" data-slider data-options="start: 20; end: 200; initial: 20;"> <span class="range-slider-handle" role="slider" tabindex="0"></span> <span class="range-slider-active-segment"></span> <input type="hidden"> </div> <span id="lb-zoom-max"></span> </div> </div> <% if(figureList.length > 1) { %> <div class="fig-btns-container"> <span class="fig-btn all-fig-btn"><i class="icon icon-all"></i> All Figures</span> <span class="fig-btn next-fig-btn"><i class="icon icon-next"></i> Next</span> <span class="fig-btn prev-fig-btn"><i class="icon icon-prev"></i> Previous</span> </div> <% } %> </div> <div id="image-context"> </div> </div> </div> </script> <script id="image-context-template" type="text/template"> <div class="footer-text"> <div id="figure-description-wrapper"> <div id="view-more-wrapper" style="<% descriptionExpanded? print('display:none;') : '' %>"> <span id="figure-title"><%= title %></span> <p id="figure-description"> <%= description %> </p> <span id="view-more">show more<i class="icon-arrow-right"></i></span> </div> <div id="view-less-wrapper" style="<% descriptionExpanded? print('display:inline-block;') : '' %>" > <span id="figure-title"><%= title %></span> <p id="full-figure-description"> <%= description %> <span id="view-less">show less<i class="icon-arrow-left"></i></span> </p> </div> </div> </div> <div id="show-context-container"> <a class="btn show-context" href="<%= showInContext(strippedDoi) %>">Show in Context</a> </div> <div id="download-buttons"> <h3>Download:</h3> <div class="item"> <a href="/plosone/article/figure/image?size=original&download=&id=<%= doi %>" title="original image"> <span class="download-btn">TIFF</span> </a> <span class="file-size"><%= fileSizes.original %></span> </div> <div class="item"> <a href="/plosone/article/figure/image?size=large&download=&id=<%= doi %>" title="large image"> <span class="download-btn">PNG</span> </a> <span class="file-size"><%= fileSizes.large %></span> </div> <div class="item"> <a href="/plosone/article/figure/powerpoint?id=<%= doi %>" title="PowerPoint slide"> <span class="download-btn">PPT</span> </a> </div> </div> </script> <div class="article-content"> <div id="figure-carousel-section"> <h2>Figures</h2> <div id="figure-carousel"> <div class="carousel-wrapper"> <div class="slider"> <div class="carousel-item lightbox-figure" data-doi="10.1371/journal.pone.0019884.g001"> <img src="/plosone/article/figure/image?size=inline&id=10.1371/journal.pone.0019884.g001" loading="lazy" alt="Figure 1" /> </div> <div class="carousel-item lightbox-figure" data-doi="10.1371/journal.pone.0019884.g002"> <img src="/plosone/article/figure/image?size=inline&id=10.1371/journal.pone.0019884.g002" loading="lazy" alt="Figure 2" /> </div> <div class="carousel-item lightbox-figure" data-doi="10.1371/journal.pone.0019884.g003"> <img src="/plosone/article/figure/image?size=inline&id=10.1371/journal.pone.0019884.g003" loading="lazy" alt="Figure 3" /> </div> <div class="carousel-item lightbox-figure" data-doi="10.1371/journal.pone.0019884.g004"> <img src="/plosone/article/figure/image?size=inline&id=10.1371/journal.pone.0019884.g004" loading="lazy" alt="Figure 4" /> </div> <div class="carousel-item lightbox-figure" data-doi="10.1371/journal.pone.0019884.g005"> <img src="/plosone/article/figure/image?size=inline&id=10.1371/journal.pone.0019884.g005" loading="lazy" alt="Figure 5" /> </div> <div class="carousel-item lightbox-figure" data-doi="10.1371/journal.pone.0019884.g006"> <img src="/plosone/article/figure/image?size=inline&id=10.1371/journal.pone.0019884.g006" loading="lazy" alt="Figure 6" /> </div> </div> </div> <div class="carousel-control"> <span class="button previous"></span> <span class="button next"></span> </div> <div class="carousel-page-buttons"> </div> </div> </div> <script src="/resource/js/vendor/jquery.touchswipe.js" type="text/javascript"></script> <script src="/resource/js/components/figure_carousel.js" type="text/javascript"></script> <script src="/resource/js/vendor/jquery.dotdotdot.js" type="text/javascript"></script> <div class="article-text" id="artText"> <div xmlns:plos="http://plos.org" class="abstract toc-section abstract-type-"><a id="abstract0" name="abstract0" data-toc="abstract0" class="link-target" title="Abstract"></a><h2>Abstract</h2><div class="abstract-content"><a id="article1.front1.article-meta1.abstract1.p1" name="article1.front1.article-meta1.abstract1.p1" class="link-target"></a><p>We present an algorithm to identify individual neural spikes observed on high-density multi-electrode arrays (MEAs). Our method can distinguish large numbers of distinct neural units, even when spikes overlap, and accounts for intrinsic variability of spikes from each unit. As MEAs grow larger, it is important to find spike-identification methods that are <em>scalable</em>, that is, the computational cost of spike fitting should scale well with the number of units observed. Our algorithm accomplishes this goal, and is fast, because it exploits the spatial locality of each unit and the basic biophysics of extracellular signal propagation. Human interaction plays a key role in our method; but effort is minimized and streamlined via a graphical interface. We illustrate our method on data from guinea pig retinal ganglion cells and document its performance on simulated data consisting of spikes added to experimentally measured background noise. We present several tests demonstrating that the algorithm is highly accurate: it exhibits low error rates on fits to synthetic data, low refractory violation rates, good receptive field coverage, and consistency across users.</p> </div></div> <div xmlns:plos="http://plos.org" class="articleinfo"><p><strong>Citation: </strong>Prentice JS, Homann J, Simmons KD, Tkačik G, Balasubramanian V, Nelson PC (2011) Fast, Scalable, Bayesian Spike Identification for Multi-Electrode Arrays. PLoS ONE 6(7): e19884. https://doi.org/10.1371/journal.pone.0019884</p><p><strong>Editor: </strong>William Rowland Taylor, Oregon Health & Science University, United States of America</p><p><strong>Received: </strong>September 1, 2010; <strong>Accepted: </strong>April 19, 2011; <strong>Published: </strong> July 20, 2011</p><p><strong>Copyright: </strong> © 2011 Prentice et al. This is an open-access article distributed under the terms of the Creative Commons Attribution License, which permits unrestricted use, distribution, and reproduction in any medium, provided the original author and source are credited.</p><p><strong>Funding: </strong>This work was supported by National Science Foundation (NSF) grants IBN-0344678, EF-0928048, National Institutes of Health (NIH) grant RO1 EY08124, NIH training grant T32-07035, and NIH training grant 5T90DA022763-04. The funders had no role in study design, data collection and analysis, decision to publish, or preparation of the manuscript.</p><p><strong>Competing interests: </strong> The authors have declared that no competing interests exist.</p></div> <div xmlns:plos="http://plos.org" id="section1" class="section toc-section"><a id="s1" name="s1" data-toc="s1" class="link-target" title="Introduction"></a><h2>Introduction</h2><a id="article1.body1.sec1.p1" name="article1.body1.sec1.p1" class="link-target"></a><p>The vertebrate retina is an important model system in neuroscience because it is amenable to detailed study despite having a complex structural and functional architecture <a href="#pone.0019884-Sterlng1" class="ref-tip">[1]</a>. Population coding and collective behavior in the retinal output is studied by use of multi-electrode arrays (MEAs) to record extracellularly from many retinal ganglion cells (RGCs) simultaneously <a href="#pone.0019884-Meister1" class="ref-tip">[2]</a>, <a href="#pone.0019884-Devries1" class="ref-tip">[3]</a>. Similar recordings can now also be made in other brain areas <a href="#pone.0019884-Buzski1" class="ref-tip">[4]</a>. MEAs offer unprecedented possibilities to obtain both single neuron and single action potential resolution from large tissue samples. However, recordings obtained in this way are useful only if most spikes can be assigned, with sufficient accuracy, to the neurons that generated them. Even if each neuron spikes with a unique waveform signature, we must still determine all those “template” waveforms present in a dataset, separating them from each other and from noise. Moreover, in practice there can be wide variation in the spike waveforms from a given unit (for instance in amplitude), complicating the task of determining from data which units fired and when.</p> <a id="article1.body1.sec1.p2" name="article1.body1.sec1.p2" class="link-target"></a><p>This “spike sorting problem” is therefore a bottleneck in the use of high density arrays with hundreds or thousands of electrodes. Methods that were manageable with tetrodes <a href="#pone.0019884-Gray1" class="ref-tip">[5]</a> do not generally scale up to the massive datasets that large arrays generate. For example, some standard methods cluster data by manually examining two-dimensional projections in a feature space of a few tens of dimensions. This approach is infeasible when the feature space contains thousands of dimensions.</p> <a id="article1.body1.sec1.p3" name="article1.body1.sec1.p3" class="link-target"></a><p>Another challenge with large arrays is that the chance of seeing a single isolated spike becomes negligible, simply because there is so much activity. Thus we must find template waveforms corresponding to the activity of single neural units (as extracellular recording cannot unambiguously identify distinct single neurons, we will refer to our recovered putative neurons as “neural units”) without ever seeing a pristine example of one, and we must be prepared to decompose temporally overlapping spikes in essentially every recorded event. Overlaps in both space and time are less frequent, but they nevertheless must be resolved if we wish to unravel the patterns of collective neural activity. Resolution methods that rely on exhaustively checking all possible combinations suffer a combinatorial explosion for large arrays. Further, any spike decomposition method must stop before every spike has been found, because there will be some units whose intrinsic amplitude is not larger than recording noise. We need a principled approach to terminating each fit and to deciding later which units' activities have been reliably captured.</p> <a id="article1.body1.sec1.p4" name="article1.body1.sec1.p4" class="link-target"></a><p>Thus, to be most useful for large arrays, a spike identification algorithm should ideally both <em>scale well</em> and also <em>be able to decompose overlapping events</em>. This article outlines a method that accomplishes these goals (MATLAB code available upon request.) It first clusters a small subset of a larger dataset, using a partially automated, human-guided clustering technique. This manual step is efficient, and scalable, because (i) the clustering is based on an ordering that arranges event data by similarity along a single dimension, (ii) the ordered data display band-like features that are visually very salient for human operators, making cluster cutting unambiguous, and (iii) the algorithm is robust to variations and outliers in the cluster-cutting procedure. The algorithm then fits the full dataset to the spike templates thus obtained, using a modified Bayesian approach. In our data (from guinea pig retina) most of the intrinsic variability of spikes from a given unit consists of amplitude variation only, whereas other variability can be summarized as a universal (spike-independent) noise process. By carefully modeling these circumstances we greatly reduce our computational burden.</p> <a id="article1.body1.sec1.p5" name="article1.body1.sec1.p5" class="link-target"></a><p>After characterizing the spatiotemporal character of the noise, our algorithm identifies spikes iteratively in a matching-pursuit (or “greedy”) scheme <a href="#pone.0019884-Mallat1" class="ref-tip">[6]</a>, <a href="#pone.0019884-Segev1" class="ref-tip">[7]</a>. Fitting terminates when addition of another spike does not improve the posterior probability of a fit; a natural overfitting penalty is provided by prior probabilities of firing and of spike amplitude. No assumptions are made about spike time cross-correlations; in particular, we do not require <em>a priori</em> any refractory “hole” in the spike time autocorrelation functions. Nevertheless, all of the inferred spike trains corresponding to otherwise acceptable spike types do exhibit such a hole, which serves as a check on our results. Fitting is followed by several qualitative post-hoc validations of the templates. Where our method requires human judgment, we structure our techniques and develop tools to facilitate interaction and proofreading.</p> <a id="article1.body1.sec1.p6" name="article1.body1.sec1.p6" class="link-target"></a><p>Our approach combines successful elements from previous techniques: the empirical characterization of the noise <a href="#pone.0019884-Pouzat1" class="ref-tip">[8]</a>; separation of clustering and fitting steps and the iterative subtraction scheme for handling overlaps <a href="#pone.0019884-Segev1" class="ref-tip">[7]</a>; and division of the clustering task by leader electrode address <a href="#pone.0019884-Litke1" class="ref-tip">[9]</a>. Novel features of our approach include systematic exploitation of the spatial organization of the signals, the use of an ordering algorithm to greatly simplify clustering, the observation that the noise temporal correlation is well represented by a simple function, an explicit model of spike amplitude variation, and the introduction of a principled Bayesian likelihood criterion for terminating spike fitting. Each of these innovations adds a critical element to the success of our spike sorting method. Although we focused on data taken on vertebrate retina, the methods should be equally applicable to other kinds of MEA data, for example in other brain areas <a href="#pone.0019884-Buzski1" class="ref-tip">[4]</a>.</p> </div> <div xmlns:plos="http://plos.org" id="section2" class="section toc-section"><a id="s2" name="s2" data-toc="s2" class="link-target" title="Results"></a><h2>Results</h2><a id="article1.body1.sec2.p1" name="article1.body1.sec2.p1" class="link-target"></a><p>To illustrate our method, we tested our spike sorting algorithm on 120 minutes of recordings from guinea pig retinal ganglion cells (RGC), acquired with a 30-electrode, dense MEA covering about <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e001" loading="lazy" class="inline-graphic"></span> of tissue (<a href="#pone-0019884-g001">Fig. 1A</a>). The analysis described in this paper identified 1,260,475 spikes in the dataset. A typical firing event took the form <a href="#pone-0019884-g001">Fig. 1B</a>, where each panel shows <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e002" loading="lazy" class="inline-graphic"></span> of the electrical potential recorded by each electrode (or “channel”). We identified spiking events as voltages crossing a threshold of <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e003" loading="lazy" class="inline-graphic"></span>, taking into account the fact that simultaneous threshold crossings on neighboring channels represent the same spike event (see <a href="#s3">Methods</a> for details). The duration of each spike event was taken to be <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e004" loading="lazy" class="inline-graphic"></span> centered on the event's peak.</p> <a class="link-target" id="pone-0019884-g001" name="pone-0019884-g001"></a><div class="figure" data-doi="10.1371/journal.pone.0019884.g001"><div class="img-box"><a title="Click for larger image" href="article/figure/image?size=medium&id=10.1371/journal.pone.0019884.g001" data-doi="10.1371/journal.pone.0019884" data-uri="10.1371/journal.pone.0019884.g001"><img src="article/figure/image?size=inline&id=10.1371/journal.pone.0019884.g001" alt="thumbnail" class="thumbnail" loading="lazy"></a><div class="expand"></div></div><div class="figure-inline-download"> Download: <ul><li><a href="article/figure/powerpoint?id=10.1371/journal.pone.0019884.g001"><div class="definition-label">PPT</div><div class="definition-description">PowerPoint slide</div></a></li><li><a href="article/figure/image?download&size=large&id=10.1371/journal.pone.0019884.g001"><div class="definition-label">PNG</div><div class="definition-description">larger image</div></a></li><li><a href="article/figure/image?download&size=original&id=10.1371/journal.pone.0019884.g001"><div class="definition-label">TIFF</div><div class="definition-description">original image</div></a></li></ul></div><div class="figcaption"><span>Figure 1. </span> Recording chamber and typical data.</div><p class="caption_target"><a id="article1.body1.sec2.fig1.caption1.p1" name="article1.body1.sec2.fig1.caption1.p1" class="link-target"></a><p>(<em>A</em>) Typical MEA apparatus. A tissue sample was mounted in an inverted microscope, with images projected onto it via a small video monitor at the camera port (not visible). <em>Clockwise from left</em>, 1: suction; 2: tissue hold-down ring; 3: perfusion inflow, with temperature control; 4: preamplifier; 5: location of the multi-electrode array. (<em>B</em>) Example of a single-spike event. Each subpanel shows the time course of electrical potential (<span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e005" loading="lazy" class="inline-graphic"></span>) on a particular electrode in the <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e006" loading="lazy" class="inline-graphic"></span> array. The electrodes are separated by <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e007" loading="lazy" class="inline-graphic"></span> (similar to RGC spacing). A spike from one unit is visible in the lower right corner and an axonal spike can be seen running vertically in the second column of electrodes. Data were acquired at <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e008" loading="lazy" class="inline-graphic"></span>. After baseline subtraction and high-pass filtering, a spatial whitening filter was applied (see <a href="#s3">Methods</a>, Step 1).</p> </p><p class="caption_object"><a href="https://doi.org/10.1371/journal.pone.0019884.g001"> https://doi.org/10.1371/journal.pone.0019884.g001</a></p></div><a id="article1.body1.sec2.p2" name="article1.body1.sec2.p2" class="link-target"></a><p>In addition to identifiable spikes, each electrode had background activity with a standard deviation of <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e009" loading="lazy" class="inline-graphic"></span> that we will collectively refer to as “noise.” Potential sources for this activity include true (Johnson) noise in the electrode and electronics, electrical pickup from the environment, as well as a hash of background activity from weak or distant neurons <a href="#pone.0019884-Fee1" class="ref-tip">[10]</a>. A challenge for spike identification is that in general there is no way to separate these three classes of “noise” cleanly from each other, nor from the spikes of interest to us. Nevertheless, we will propose a technique for identifying spikes that is very accurate for firing events with intrinsic amplitude at least 4 times the standard deviation of the noise.</p> <a id="article1.body1.sec2.p3" name="article1.body1.sec2.p3" class="link-target"></a><p><a href="#pone-0019884-g001">Fig. 1B</a> illustrates that each single firing unit will be “heard” on multiple electrodes, and that those electrodes form a spatially localized group. Our method is scalable because it systematically exploits this simple observation: even on a large electrode array, most firing units will involve only a handful of electrodes. (Some of our signals were <em>not</em> local, and stretched over the entire electrode array in a line (e.g., <a href="#pone-0019884-g001">Fig. 1B</a>). We ignored such axonal signals, which were also distinguished by their low amplitude and triphasic shape.)</p> <div id="section1" class="section toc-section"><a id="s2a" name="s2a" class="link-target" title="Preliminary visualization of our data"></a> <h3>Preliminary visualization of our data</h3> <a id="article1.body1.sec2.sec1.p1" name="article1.body1.sec2.sec1.p1" class="link-target"></a><p>We first attempted a “geographical clustering”: from each event we found the minimum of the potential on each channel and the channel containing the deepest minimum (“leader channel”). We then used the absolute values of the minima as weights in a weighted average of the locations of the <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e010" loading="lazy" class="inline-graphic"></span> electrodes neighboring the leader channel. This weighted average gave a particularly salient two-dimensional feature, the event's <em>barycenter</em>:<a name="" id="" class="link-target"></a><span class="equation"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e011" loading="lazy" class="inline-graphic"></span>The sums run over the <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e012" loading="lazy" class="inline-graphic"></span> electrodes neighboring the leader, and <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e013" loading="lazy" class="inline-graphic"></span> is the location of the <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e014" loading="lazy" class="inline-graphic"></span> neighbor electrode. We then augmented <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e015" loading="lazy" class="inline-graphic"></span> with a third feature, <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e016" loading="lazy" class="inline-graphic"></span>, minus the absolute peak potential. These three features gave a scatterplot that clearly showed many well-separated clusters (<a href="#pone-0019884-g002">Fig. 2A</a>), without any need to deduce the “best” features by principal component analysis (<a href="#pone-0019884-g002">Fig. 2B</a>).</p> <a class="link-target" id="pone-0019884-g002" name="pone-0019884-g002"></a><div class="figure" data-doi="10.1371/journal.pone.0019884.g002"><div class="img-box"><a title="Click for larger image" href="article/figure/image?size=medium&id=10.1371/journal.pone.0019884.g002" data-doi="10.1371/journal.pone.0019884" data-uri="10.1371/journal.pone.0019884.g002"><img src="article/figure/image?size=inline&id=10.1371/journal.pone.0019884.g002" alt="thumbnail" class="thumbnail" loading="lazy"></a><div class="expand"></div></div><div class="figure-inline-download"> Download: <ul><li><a href="article/figure/powerpoint?id=10.1371/journal.pone.0019884.g002"><div class="definition-label">PPT</div><div class="definition-description">PowerPoint slide</div></a></li><li><a href="article/figure/image?download&size=large&id=10.1371/journal.pone.0019884.g002"><div class="definition-label">PNG</div><div class="definition-description">larger image</div></a></li><li><a href="article/figure/image?download&size=original&id=10.1371/journal.pone.0019884.g002"><div class="definition-label">TIFF</div><div class="definition-description">original image</div></a></li></ul></div><div class="figcaption"><span>Figure 2. </span> Visualization of data; flowchart of our method.</div><p class="caption_target"><a id="article1.body1.sec2.sec1.fig1.caption1.p1" name="article1.body1.sec2.sec1.fig1.caption1.p1" class="link-target"></a><p>(<em>A</em>) <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e017" loading="lazy" class="inline-graphic"></span> firing events cluster well in terms of their <em>barycenter</em> (voltage weighted average spatial location) and absolute peak voltage (see text), despite wide amplitude dispersion in some groups; each combination of color and marker size corresponds to one spiking unit identified by the clustering method developed in the text. Grey points were unassigned to any cluster. A total of 107 clusters are marked. (<em>B</em>) Events cluster poorly when projected onto the three principal features uncovered by principal component analysis (PCA). Coloring as in (<em>A</em>). (<em>C</em>) Schematic of our spike sorting method. Dashed lines involve a small subset of a full dataset. The backwards arrow describes the introduction of new spike templates found after the first pass of fitting; a total of two passes are performed. (<em>D</em>) The optics algorithm orders all firing events into a linear sequence based on a distance measure (see text). Events are lined up in this order (x-axis), and represented in terms of the 960 voltage samples recorded by all the electrodes during a 3.2 ms firing event (y-axis; from top to bottom, 32 consecutive time samples from one channel, then 32 time samples from the second channel, and so on). The human operator highlights bands of events (typically very clear to an observer) that appear to constitute a single cluster; one such band is shown. Later automated diagnostics refine and check these assessments.</p> </p><p class="caption_object"><a href="https://doi.org/10.1371/journal.pone.0019884.g002"> https://doi.org/10.1371/journal.pone.0019884.g002</a></p></div><a id="article1.body1.sec2.sec1.p2" name="article1.body1.sec2.sec1.p2" class="link-target"></a><p>This extension of the “triangulation” method developed for tetrode recordings <a href="#pone.0019884-Gray1" class="ref-tip">[5]</a> already shows key aspects of the data: (a) many clusters are highly dispersed in amplitude, and (b) some cluster pairs appear at nearly the same spatial locations but are nevertheless well separated by amplitude. The first circumstance means that we must allow for variable amplitude when fitting spikes to templates representing the clusters. The second warns us that a simple least-squares fit to amplitude could confound two distinct units. For this reason our spike-fitting method employs a Bayesian prior for each cluster's amplitude variation, allowing us to make such discriminations.</p> <a id="article1.body1.sec2.sec1.p3" name="article1.body1.sec2.sec1.p3" class="link-target"></a><p>Although the simple clustering based on spatial location in <a href="#pone-0019884-g002">Fig. 2A</a> looks promising, it can be misleading. Indeed, the restriction of the weighted average to the <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e018" loading="lazy" class="inline-graphic"></span> electrodes around the leader can artificially separate clusters by biasing the barycenter to be located near a particular electrode. This problem could be alleviated by using a larger neighborhood, but on large arrays there will inevitably be temporal collisions of spikes from distinct units. The barycentric features in <a href="#pone-0019884-g002">Fig. 2A</a> will register such collisions as a haze of seemingly random spots. Thus, at a minimum the MEA voltage traces must be segmented by exploiting the spatial locality of recorded responses. Despite these shortcomings, <a href="#pone-0019884-g002">Fig. 2A</a> points out why the more sophisticated method developed in this article can succeed: the “geographic” information encoded by the MEA is a powerful intrinsic clue to each unit's identity.</p> </div> <div id="section2" class="section toc-section"><a id="s2b" name="s2b" class="link-target" title="Summary of our method"></a> <h3>Summary of our method</h3> <a id="article1.body1.sec2.sec2.p1" name="article1.body1.sec2.sec2.p1" class="link-target"></a><p>Our sorting method is outlined in <a href="#pone-0019884-g002">Fig. 2C</a> (details in <a href="#s3">Methods</a> and <a href="#pone.0019884.s001">Text S1</a> Sect. B). From a subset of the raw data, we made a preliminary classification of spike events in terms of the electrode on which they achieved their peak voltage. All events sharing a given leader channel were cropped to the <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e019" loading="lazy" class="inline-graphic"></span> electrodes neighboring the leader, then ordered with the <span class="small-caps">optics</span> algorithm <a href="#pone.0019884-Ankerst1" class="ref-tip">[11]</a> into a linear sequence. The <span class="small-caps">optics</span> algorithm places similar events nearby in the sequence; distance was measured by a normalized Euclidean distance between event voltage traces (see <a href="#s3">Methods</a>). The linear sequence of events was displayed to the user along with all the recorded voltage samples for each event (<a href="#pone-0019884-g002">Fig. 2D</a>), and manually clustered. Although the ordering was based on events cropped to <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e020" loading="lazy" class="inline-graphic"></span> channels, the full waveforms were displayed to the user (<a href="#pone-0019884-g002">Fig. 2D</a>). Because the data are ordered in one dimension, and because precision is not required in view of later refinement, this manual step remains rapid. An automated method for cluster cutting could be implemented, but in view of the inevitable desire for human proofreading we preferred to simply carry out this step by hand. From each preliminary cluster, we estimated a template waveform representing the corresponding neural unit and then fit the templates to the remaining data. Fitting was accomplished by a Bayesian algorithm based on a probabilistic model capturing the dominant sources of variability we observed in our data: background noise, spike amplitude variation, and overlapping spikes from distinct units. After finding, for each event, the most probable template which accounts for the event, we subtracted it and then iterated. Finally, the fit results were used in a post-hoc validation of the initial clustering, and we repeated the procedure in a second pass if necessary. Details of each step are presented in <a href="#s3">Methods</a>.</p> </div> <div id="section3" class="section toc-section"><a id="s2c" name="s2c" class="link-target" title="Tests of our method"></a> <h3>Tests of our method</h3> <a id="article1.body1.sec2.sec3.p1" name="article1.body1.sec2.sec3.p1" class="link-target"></a><p><span class="small-caps">optics</span>-based clustering of a subset of our dataset led to 107 potential templates for events from distinct neural units. Many of these templates had low amplitudes; such low-amplitude templates were sometimes mistakenly fit to noise by our algorithm. We therefore rejected units that were likely to contain substantial noise fits because they were of amplitude less than or comparable to the noise (details in <a href="#s3">Methods</a> and <a href="#pone.0019884.s001">Text S1</a> Sect. H). This left fifty potentially reliable units that were accepted in our dataset.</p> <div id="section1" class="section toc-section"><a id="s2c1" name="s2c1" class="link-target" title="Comparison with geographical clusters"></a><h4>Comparison with geographical clusters.</h4><a id="article1.body1.sec2.sec3.sec1.p1" name="article1.body1.sec2.sec3.sec1.p1" class="link-target"></a><p>Our optics-based procedure identified 107 potential clusters of events in a subset of the data. To check that the procedure gave reasonable results we plotted each event in the barycentric coordinates of <a href="#pone-0019884-g002">Fig. 2A</a>, and colored the events according to the assigned cluster label. The clusters were spatially localized and separated in peak amplitude, as they should be if they were produced by distinct single neurons. Gray dots in <a href="#pone-0019884-g002">Fig. 2A</a> were not assigned to any cluster. Some of these events contained overlaps of spikes that were not resolved by the initial spatial segmentation of data during the preprocessing step. The subsequent spike fitting step in our algorithm resolved most such ambiguities.</p> </div> <div id="section2" class="section toc-section"><a id="s2c2" name="s2c2" class="link-target" title="Error rates on synthetic data"></a><h4>Error rates on synthetic data.</h4><a id="article1.body1.sec2.sec3.sec2.p1" name="article1.body1.sec2.sec3.sec2.p1" class="link-target"></a><p>To validate our algorithm we tested its performance on synthetic data created by adding spikes to experimentally measured background noise clips, then fitting templates to each clip. We took noise clips to be <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e021" loading="lazy" class="inline-graphic"></span> segments of time during which no spikes were recorded on any channel; we identified 14,000 such clips. For each clip, we randomly chose a fixed number (1, 3, or 5) of templates from the initial set of 107, with uniform probability and without replacement. We then added these templates to the noise clip at random times, leaving a margin of <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e022" loading="lazy" class="inline-graphic"></span> on either side of the clip to prevent waveforms from being cut off. (Our typical template waveforms extended approximately <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e023" loading="lazy" class="inline-graphic"></span> to either side of the peak.) We gave each spike an amplitude drawn from a Gaussian distribution with mean equal to its template amplitude and standard deviation 10% of the template amplitude (this was similar to the observed distribution).</p> <a id="article1.body1.sec2.sec3.sec2.p2" name="article1.body1.sec2.sec3.sec2.p2" class="link-target"></a><p>The template fitting algorithm was then run over this synthetic dataset and analyzed for false positive and false negative rates (<a href="#pone-0019884-g003">Fig. 3A</a>). We counted a false negative for a template every time that template was present in an event but not fit correctly to within <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e024" loading="lazy" class="inline-graphic"></span>; we counted a false positive every time a template was fit to the data without actually being present. The error rates increased with the number of template overlaps; thus, for the fifty templates with amplitudes that exceed the noise, we separately plotted error rate histograms for each degree of overlap. Error rates were robustly low – even within extremely complex events with 5 overlapping spikes (rare in the data), the majority of spike templates had an error rate of a few percent or less. To gain perspective on these values, we measured the number of templates fit to each event in our recorded data: 60% of events contained 1 spike, 94% 3 or fewer spikes, and 98% had 5 spikes or fewer. Most of the errors were made on lower amplitude templates for which amplitude variations can lead to confusion with noise.</p> <a class="link-target" id="pone-0019884-g003" name="pone-0019884-g003"></a><div class="figure" data-doi="10.1371/journal.pone.0019884.g003"><div class="img-box"><a title="Click for larger image" href="article/figure/image?size=medium&id=10.1371/journal.pone.0019884.g003" data-doi="10.1371/journal.pone.0019884" data-uri="10.1371/journal.pone.0019884.g003"><img src="article/figure/image?size=inline&id=10.1371/journal.pone.0019884.g003" alt="thumbnail" class="thumbnail" loading="lazy"></a><div class="expand"></div></div><div class="figure-inline-download"> Download: <ul><li><a href="article/figure/powerpoint?id=10.1371/journal.pone.0019884.g003"><div class="definition-label">PPT</div><div class="definition-description">PowerPoint slide</div></a></li><li><a href="article/figure/image?download&size=large&id=10.1371/journal.pone.0019884.g003"><div class="definition-label">PNG</div><div class="definition-description">larger image</div></a></li><li><a href="article/figure/image?download&size=original&id=10.1371/journal.pone.0019884.g003"><div class="definition-label">TIFF</div><div class="definition-description">original image</div></a></li></ul></div><div class="figcaption"><span>Figure 3. </span> Tests of the method.</div><p class="caption_target"><a id="article1.body1.sec2.sec3.sec2.fig1.caption1.p1" name="article1.body1.sec2.sec3.sec2.fig1.caption1.p1" class="link-target"></a><p>(<em>A</em>) (<em>Top</em>) The cumulative percentage of templates having false negative probabilities less than the indicated values. Error rates were measured in fits to synthetic data as the fraction of times a fit was <em>not</em> reported for a template when it was actually present. (<em>Bottom</em>) As above, but showing false positive probabilities (fraction of times a fit was reported for a template when it was <em>not</em> actually present). Results reported separately for fits to events with different numbers of overlapping spikes (inset colors). (<em>B</em>) Correlation in spike trains across fits by three different users (A, B, and C). Each curve corresponds to one pair of users and gives the cumulative fraction of templates having lower correlation than indicated. See main text for further details. (<em>C</em>) Cumulative fraction of templates having fewer refractory violations than indicated. Refractory violations are rare (see text). (<em>D</em>) The centers of 19 OFF cell receptive fields recorded from a single piece of tissue. To map a neuron's receptive field center, we first find the peak (in space and time) of the spike-triggered average stimulus. Restricting to the peak time, we apply cubic spline interpolation in space and then draw contour lines at 75% of the peak value.</p> </p><p class="caption_object"><a href="https://doi.org/10.1371/journal.pone.0019884.g003"> https://doi.org/10.1371/journal.pone.0019884.g003</a></p></div></div> <div id="section3" class="section toc-section"><a id="s2c3" name="s2c3" class="link-target" title="Refractory violations"></a><h4>Refractory violations.</h4><a id="article1.body1.sec2.sec3.sec3.p1" name="article1.body1.sec2.sec3.sec3.p1" class="link-target"></a><p>When sorting spikes recorded extracellularly, ground truth can be assessed if simultaneous intracellular recordings are available, e.g., <a href="#pone.0019884-Harris1" class="ref-tip">[12]</a>. Since we do not have such recordings, in order to validate our algorithm on real data we examined the rate of refractory violations – i.e., the fraction of interspike intervals of duration less that <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e025" loading="lazy" class="inline-graphic"></span>. Refractory violations can appear in our sorted data if spikes from distinct neural units are mis-assigned to the same unit, or if noise fluctuations are mistaken for spikes. Of the 107 templates constructed from the initial clustering 84% had less than 0.5% refractory violations and all had less than 2.5%, providing evidence that the templates produced by the initial clustering rarely merge distinct neural units (<a href="#pone-0019884-g003">Fig. 3C</a>). More significantly, all fifty templates describing units that rose reliably over the noise level had less than 0.5% refractory violations. Futhermore, 96% of these had less than 0.1% refractory violations (<a href="#pone-0019884-g003">Fig. 3C</a>). Note that the percentage of refractory violations only provides a lower bound on the number of misidentified spikes – nevertheless, the low refractory violation rates we observed provide strong evidence that our algorithm makes few fitting mistakes on the units otherwise identified as reliable.</p> </div> <div id="section4" class="section toc-section"><a id="s2c4" name="s2c4" class="link-target" title="Coverage"></a><h4>Coverage.</h4><a id="article1.body1.sec2.sec3.sec4.p1" name="article1.body1.sec2.sec3.sec4.p1" class="link-target"></a><p>While the absence of refractory violations gives evidence that our algorithm does not merge different neural units together, it might still split spikes from the same unit into two distinct clusters if, e.g. there was substantial amplitude variation. To test for this, for each unit that was above the noise level we measured the linear receptive field by taking the spike triggered average (STA) of the flickering checkerboard stimulus ( Sect. B). We expect that such receptive fields will be connected regions of the visual field, roughly elliptical in shape, and that no two units will have identical receptive fields. 31 of the 50 reliably identified units had enough spikes to give reliable estimates of the spatial receptive field. Of these, examination of the temporal kernel showed that 19 were OFF cells (responding to light decrement) and 12 were ON cells (responding to light increment), consistent with the expected excess of OFF ganglion cells <a href="#pone.0019884-Ratliff1" class="ref-tip">[13]</a>–<a href="#pone.0019884-Tauchi1" class="ref-tip">[18]</a>. None of these receptive fields were identical, giving evidence that our algorithm did not split single units into multiple clusters. Further, all of the receptive fields were connected, suggesting that none of our clusters are mixtures of different RGC. In addition, essentially all of the recorded area was covered by at least one receptive field (coverage of OFF cells shown in <a href="#pone-0019884-g003">Fig. 3D</a>). The density of RGCs in guinea pig varies from <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e026" loading="lazy" class="inline-graphic"></span> to <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e027" loading="lazy" class="inline-graphic"></span> <a href="#pone.0019884-DoNascimento1" class="ref-tip">[19]</a>. We receive signals from a region slightly larger than the electrode array, roughly <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e028" loading="lazy" class="inline-graphic"></span>. Thus the expected number of RGC is 16–97, comparable to our total of 31 receptive fields, keeping in mind that many of the sluggish cell types would not have enough spikes to yield a good spike triggered average.</p> </div> <div id="section5" class="section toc-section"><a id="s2c5" name="s2c5" class="link-target" title="Different users"></a><h4>Different users.</h4><a id="article1.body1.sec2.sec3.sec5.p1" name="article1.body1.sec2.sec3.sec5.p1" class="link-target"></a><p>Because our method involves human intervention, there exists a risk that different users could obtain divergent results. One possible discrepancy is that different users could identify distinct sets of templates. This would not pose a serious problem in and of itself, as long as further analysis did not demand a complete population. Moreover, the completeness of the template set is ultimately limited only by the time invested by the operator in clustering. However, it would be problematic if the spike trains fit to <em>the same</em> template by different users differed significantly. To assess the robustness of our method, we therefore had three different users (here referred to as A, B, and C) carry out our spike sorting procedure on the same data set and examined the correlation of the results. User A found 20 templates with large enough spike counts to assess cross-correlation, B found 25, and C found 28. While these numbers were smaller than the 50 we had identified previously, the difference consisted of units with extremely low firing rates. We compared the three sets of templates to identify those which were found by multiple users, by minimizing the euclidean distance between template pairs. 18 templates agreed between A and B, 18 between A and C, and 23 between B and C. A total of 17 templates were found by all three users. For each template that was found by at least two users, we computed the cross-correlation coefficient of the corresponding spike trains. Across all pairs of users, two-thirds of such templates had a spike train correlation higher than 0.95 (<a href="#pone-0019884-g003">Fig. 3B</a>).</p> </div> <div id="section6" class="section toc-section"><a id="s2c6" name="s2c6" class="link-target" title="Complex events"></a><h4>Complex events.</h4><a id="article1.body1.sec2.sec3.sec6.p1" name="article1.body1.sec2.sec3.sec6.p1" class="link-target"></a><p>A major challenge for a spike sorting algorithm is dealing with variability in spikes produced by individual neural units. An even greater challenge arises from spatio-temporal overlaps between spikes from different neural units. Our low error rate in analysis of synthetic data containing both of these complexities (<a href="#pone-0019884-g003">Fig. 3</a>) provides evidence that our algorithm is effective at resolving overlaps and identifying variable spikes from given units. To test this further, we manually examined many events in the real data which a human observer could identify as representing overlaps or neural variability; and our algorithm typically did an excellent job of dealing with variable-amplitude bursts (<a href="#pone-0019884-g004">Fig. 4B</a>), as well as events that overlap in space and time (<a href="#pone-0019884-g004">Fig. 4C</a>).</p> <a class="link-target" id="pone-0019884-g004" name="pone-0019884-g004"></a><div class="figure" data-doi="10.1371/journal.pone.0019884.g004"><div class="img-box"><a title="Click for larger image" href="article/figure/image?size=medium&id=10.1371/journal.pone.0019884.g004" data-doi="10.1371/journal.pone.0019884" data-uri="10.1371/journal.pone.0019884.g004"><img src="article/figure/image?size=inline&id=10.1371/journal.pone.0019884.g004" alt="thumbnail" class="thumbnail" loading="lazy"></a><div class="expand"></div></div><div class="figure-inline-download"> Download: <ul><li><a href="article/figure/powerpoint?id=10.1371/journal.pone.0019884.g004"><div class="definition-label">PPT</div><div class="definition-description">PowerPoint slide</div></a></li><li><a href="article/figure/image?download&size=large&id=10.1371/journal.pone.0019884.g004"><div class="definition-label">PNG</div><div class="definition-description">larger image</div></a></li><li><a href="article/figure/image?download&size=original&id=10.1371/journal.pone.0019884.g004"><div class="definition-label">TIFF</div><div class="definition-description">original image</div></a></li></ul></div><div class="figcaption"><span>Figure 4. </span> Template fitting to complex events.</div><p class="caption_target"><a id="article1.body1.sec2.sec3.sec6.fig1.caption1.p1" name="article1.body1.sec2.sec3.sec6.fig1.caption1.p1" class="link-target"></a><p>(<em>A</em>) Example of a single-spike event. Each subpanel shows the time course of electrical potential (in <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e029" loading="lazy" class="inline-graphic"></span>, <em>black curves</em>), on a particular electrode in the <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e030" loading="lazy" class="inline-graphic"></span> array. After baseline subtraction and high-pass filtering, a spatial whitening filter was applied (see <a href="#s3">Methods</a>). <em>Red curves</em> show the result of our fitting algorithm, in this case a single template waveform representing an individual neural unit. (<em>B</em>) Detail of a more complex event and its fit, in which a single unit fires a burst of 9 spikes of varying amplitudes (upper left channel), while a different unit fires 5 other spikes (upper right channel). Simultaneous data from four neighboring electrodes are shown. (<em>C</em>) Example of an overlap event and its fit, which now is a linear superposition of 7 templates. (<em>D</em>) Detail of (<em>C</em>), showing signals on four of the electrodes. This time individual fit spikes are displayed. The <em>red</em> and <em>green</em> traces show fit templates that, although similar, differ significantly in their overall strength, and in the relative strengths of their features. The <em>black</em> trace shows a fit to a low-amplitude template that was later classified as unusable, and hence was discarded, by the procedure in <a href="#s3">Methods</a>, Step 4.</p> </p><p class="caption_object"><a href="https://doi.org/10.1371/journal.pone.0019884.g004"> https://doi.org/10.1371/journal.pone.0019884.g004</a></p></div></div> <div id="section7" class="section toc-section"><a id="s2c7" name="s2c7" class="link-target" title="Speed"></a><h4>Speed.</h4><a id="article1.body1.sec2.sec3.sec7.p1" name="article1.body1.sec2.sec3.sec7.p1" class="link-target"></a><p>Currently the main fitting code, written in MATLAB, requires about <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e031" loading="lazy" class="inline-graphic"></span> of real computer time per fit spike on a commercial 2.5 GHz computer, times 2 for the two passes. This is fast enough for our purposes; considerable further improvement is possible with existing software (Mex) and hardware (GPU) techniques.</p> </div> </div> </div> <div xmlns:plos="http://plos.org" id="section3" class="section toc-section"><a id="s3" name="s3" data-toc="s3" class="link-target" title="Materials and Methods"></a><h2>Materials and Methods</h2> <div id="section1" class="section toc-section"><a id="s3a" name="s3a" class="link-target" title="Ethics statement"></a> <h3>Ethics statement</h3> <a id="article1.body1.sec3.sec1.p1" name="article1.body1.sec3.sec1.p1" class="link-target"></a><p>This study was carried out in accordance with recommendations from the National Institutes of Health and the guidelines of the American Veterinary Medical Association. The protocol was approved by the Animal Care and Use Committee of the University of Pennsylvania (No. 803091). All surgery was performed under ketamine/xylazine and pentobarbital anesthesia, and all efforts were made to minimize suffering.</p> </div> <div id="section2" class="section toc-section"><a id="s3b" name="s3b" class="link-target" title="Experimental procedure"></a> <h3>Experimental procedure</h3> <a id="article1.body1.sec3.sec2.p1" name="article1.body1.sec3.sec2.p1" class="link-target"></a><p>Our methods were developed and tested on retinal response data, from albino guinea pig, recorded with a dense 30-electrode array (<span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e032" loading="lazy" class="inline-graphic"></span> spacing, Multi Channel Systems MCS GmbH, Reutlingen, Germany). After anesthesia with ketamine/xylazine (100/20 mg/kg) and pentobarbital (100 mg/kg), the eyeball was enucleated and the animal was killed by pentobarbital overdose in keeping with the AVMA guidelines on euthanasia. The eyeball was hemisected and the retina was allowed to dark adapt. A small piece was cut out, separated from the pigment epithelium, mounted (ganglion cells up) onto a piece of filter paper, and placed ganglion cells down onto the MEA. A <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e033" loading="lazy" class="inline-graphic"></span> flickering checkerboard consisting of binary noise, updated at 30 Hz, was projected onto the tissue (<a href="#pone.0019884.s001">Text S1</a> Sect. C). We alternated between uncorrelated and exponentially correlated (space constant <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e034" loading="lazy" class="inline-graphic"></span>; time constant 33 ms) stimuli.</p> <a id="article1.body1.sec3.sec2.p2" name="article1.body1.sec3.sec2.p2" class="link-target"></a><p>Our procedure for identifying spikes in the recorded data had four steps, each detailed below: (<strong>1</strong>) Preprocessing, where spatial locality was exploited to segment the data, (<strong>2</strong>) Clustering and template building, where a subset of the data was clustered to separate the responses of likely neural units, template waveforms for each neural unit were built, and their variability characterized, (<strong>3</strong>) Spike fitting, where every firing event was separated into a superposition of responses from different neural units, and (<strong>4</strong>) Validation of templates, where each template and the spikes identified with it were tested for reliability.</p> </div> <div id="section3" class="section toc-section"><a id="s3c" name="s3c" class="link-target" title="STEP 1: Data preparation and segmentation"></a> <h3>STEP 1: Data preparation and segmentation</h3> <a id="article1.body1.sec3.sec3.p1" name="article1.body1.sec3.sec3.p1" class="link-target"></a><p>The first step in our procedure (<a href="#pone-0019884-g002">Fig. 2C</a>) was to prepare the data for clustering of events from different neural units, by separating firing events from noise, and segmenting spatio-temporally distinct regions of spiking activity on the electrode array.</p> <a id="article1.body1.sec3.sec3.p2" name="article1.body1.sec3.sec3.p2" class="link-target"></a><p>Data from the array were sampled at 10 KHz, high-pass filtered below 200 Hz with a finite impulse response filter to remove low frequency baseline fluctuations, and then packaged into <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e035" loading="lazy" class="inline-graphic"></span> clips: (a) “noise clips” in which the potential never fell below <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e036" loading="lazy" class="inline-graphic"></span>, and (b) “spike events” surrounding moments at which the potential crossed <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e037" loading="lazy" class="inline-graphic"></span>. The duration of the clip was chosen to include the full extent of most spike events with a small margin on either side. The threshold was set such that there were no discernible spikes among the subthreshold voltage deflections, although this low-amplitude noise likely contained contributions from spikes of distant neurons (see <a href="#pone.0019884.s001">Text S1</a> Sect. G2). Clips with potentials between <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e038" loading="lazy" class="inline-graphic"></span> and <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e039" loading="lazy" class="inline-graphic"></span> were neither used to characterize noise (since they might contain small spikes) nor used to identify spikes (since they were very noisy). The threshold for spikes was set to <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e040" loading="lazy" class="inline-graphic"></span> times the standard deviation of the potential in the noise clips. Each spike event thus consisted of <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e041" loading="lazy" class="inline-graphic"></span> numbers, the potentials on a <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e042" loading="lazy" class="inline-graphic"></span> grid of space-time pixels (“stixels”). Spike events sometimes overlapped each other, for example if a burst of spikes lasted longer than <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e043" loading="lazy" class="inline-graphic"></span>. Cluster identification and spike template building (Step 2) used four 30-second segments sampled from different times, but subsequent spike fitting and sorting (Step 3) used all the data.</p> <a id="article1.body1.sec3.sec3.p3" name="article1.body1.sec3.sec3.p3" class="link-target"></a><p>Electrodes can share signals because of instrumental cross-talk and because the activity of neurons spreads passively to nearby electrodes. We modeled both effects by a linear filter that spatially blurs signals. To find this filter empirically, we noted that it also applies to the noise. Accordingly, we measured the spatial covariance of noise clips, finding that it was spatially isotropic and had a roughly exponential falloff, with a correlation length of <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e044" loading="lazy" class="inline-graphic"></span>. We applied the square root of the inverse of this covariance matrix to all data, and used the resulting “spatially whitened” data for all analysis. In some datasets this transformation sharpened the individual spikes spatially, improving our ability to distinguish them in the clustering stage. In other datasets the transformation had little effect. Our data also exhibited temporal correlations, but these have a different physical origin from the essentially instantaneous passive spatial spread. We found that <em>temporal</em> whitening prior to clustering <a href="#pone.0019884-Pouzat1" class="ref-tip">[8]</a> worsened our signal/noise ratio and impeded cluster determination. Thus we incorporated temporal correlations later, during the spike fitting.</p> <div id="section1" class="section toc-section"><a id="s3c1" name="s3c1" class="link-target" title="Segmentation"></a><h4>Segmentation.</h4><a id="article1.body1.sec3.sec3.sec1.p1" name="article1.body1.sec3.sec3.sec1.p1" class="link-target"></a><p>Each spike event is a superposition of spikes from an unknown number of distinct neural units with stereotyped waveforms that we sought to identify. We first spatially segmented the data to isolate waveforms from individual units and their immediate neighbors. To this end, we identified all stixels at which the potential was more negative than the threshold of <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e045" loading="lazy" class="inline-graphic"></span> and divided this set into connected components (two stixels were considered connected if they were nearest neighbors in either time or space). Within each connected patch we identified the absolute peak electrode and time, then extracted a <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e046" loading="lazy" class="inline-graphic"></span> region centered temporally on the peak time and cropped spatially to a neighborhood of nine channels surrounding (and including) the leader electrode. Thus each spike event was segmented into one or more cropped events; each of which was then classified according to its leader electrode. A similar segmentation method has recently been applied to the spike identification problem by J. Schulman (unpublished); see <a href="http://caton.googlecode.com">http://caton.googlecode.com</a>. In subsequent clustering, only those events having the same leader electrode were directly compared to each other <a href="#pone.0019884-Litke1" class="ref-tip">[9]</a>.</p> <a id="article1.body1.sec3.sec3.sec1.p2" name="article1.body1.sec3.sec3.sec1.p2" class="link-target"></a><p>Some cropped events might be composites of two spike types corresponding to neighboring, but distinct, neural units. However, this step at least decomposes composite events whose components are well separated in space or in time, and hence reduces the combinatorial burden inherent in large arrays; later steps handle composites missed at this stage. The method also ensures that, if spikes from two well-separated units frequently co-occur, the two units will nevertheless be correctly handled as separate.</p> </div> </div> <div id="section4" class="section toc-section"><a id="s3d" name="s3d" class="link-target" title="STEP 2: Cluster identification and template building"></a> <h3>STEP 2: Cluster identification and template building</h3> <a id="article1.body1.sec3.sec4.p1" name="article1.body1.sec3.sec4.p1" class="link-target"></a><p>The second step in our procedure (<a href="#pone-0019884-g002">Fig. 2C</a>) was to cluster spiking events in a subset of the data (four 30-second segments) into groups that had similar waveforms and thus probably came from the same neural unit. For each cluster, we produced a template waveform describing the typical spike, and determined the distribution of amplitude rescalings that best matched spikes to this template.</p> <div id="section1" class="section toc-section"><a id="s3d1" name="s3d1" class="link-target" title="Cluster identification"></a><h4>Cluster identification.</h4><a id="article1.body1.sec3.sec4.sec1.p1" name="article1.body1.sec3.sec4.sec1.p1" class="link-target"></a><p>In order to group events into clusters based on the similarity of their waveforms, some previous approaches have sought a low-dimensional set of discriminable waveform “features,” and have assumed that variability between events in the same cluster arises only from additive noise. In practice, systematic variation in the shape of spikes from single units is often observed that is not well described by additive noise. Furthermore, identifying the correct set of salient waveform features that discriminate between units is challenging (<a href="#pone.0019884-Quiroga1" class="ref-tip">[20]</a>; see <a href="#pone-0019884-g002">Fig. 2B</a>). Thus, seeking a technique that did not require feature extraction, we adapted the optics algorithm <a href="#pone.0019884-Ankerst1" class="ref-tip">[11]</a>. Briefly, optics computes distances between all pairs of waveforms, then orders the waveforms such that similar ones are placed close together in a single linear sequence. optics makes no assumption that clusters have a Gaussian distribution in feature space, nor does it set any threshold density in that space to trigger cluster identification. The linear ordering allows for easy visualization and cutting of clusters.</p> <a id="article1.body1.sec3.sec4.sec1.p2" name="article1.body1.sec3.sec4.sec1.p2" class="link-target"></a><p>We applied this algorithm to cropped and segmented spike events (obtained in Step 1) which were upsampled by a factor of 5 (using matlab's cubic spline interpolation) and then temporally aligned to place the absolute peak of the waveform at a common position before downsampling again. The interpolation was necessary to compensate for apparent variations in spike waveforms due to discrete sampling <a href="#pone.0019884-Lewicki1" class="ref-tip">[21]</a>. To reduce the fuzziness of the clusters, we masked spike events by setting voltage samples to zero if they were less negative than <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e047" loading="lazy" class="inline-graphic"></span>. As a distance metric between <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e048" loading="lazy" class="inline-graphic"></span> and <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e049" loading="lazy" class="inline-graphic"></span>, the masked potentials of spike events, we chose <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e050" loading="lazy" class="inline-graphic"></span> where <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e051" loading="lazy" class="inline-graphic"></span> indexes the potentials at each channel and timepoint, and <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e052" loading="lazy" class="inline-graphic"></span> is the total number of nonzero potentials after masking of either <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e053" loading="lazy" class="inline-graphic"></span> or <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e054" loading="lazy" class="inline-graphic"></span>. Division by <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e055" loading="lazy" class="inline-graphic"></span> normalized for the effective dimensionality (given by the number of dimensions containing nonzero entries). We observed that higher voltage traces tended to have a higher variance; the factor <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e056" loading="lazy" class="inline-graphic"></span> partially compensated for this, leading to more homogeneous clusters.</p> <a id="article1.body1.sec3.sec4.sec1.p3" name="article1.body1.sec3.sec4.sec1.p3" class="link-target"></a><p>We constructed a graphical user interface (gui) that allowed a human operator to visualize each spike event in the optics sequence as a vertical column of pixels color-coded by voltage (see <a href="#pone-0019884-g002">Fig. 2D</a>). Transitions between distinct spike types were usually obvious to the operator, who could quickly find and select bands corresponding to each spike type. (For the data in this paper, the operator found over 100 such clusters in about 30 minutes.) The software then wrote the corresponding cropped events to a set of data files. The ease of separation likely occurred because clusters could already be fairly well delineated with just the “geographical” features in <a href="#pone-0019884-g002">Fig. 2A</a>.</p> <a id="article1.body1.sec3.sec4.sec1.p4" name="article1.body1.sec3.sec4.sec1.p4" class="link-target"></a><p>Up to this point, the events being clustered were still segregated into batches according to their leader channel <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e057" loading="lazy" class="inline-graphic"></span>. Thus it was possible for a single unit to be multiply identified: If it stimulated two neighboring electrodes nearly equally, the unit could generate events in both of the corresponding batches. We tested for duplicates by manually examining pairs of clusters whose medians had a large cross-correlation and merged the clusters if necessary. There was also a possibility that the initial clustering would assign multiple units to one cluster. In these cases, visual examination of the superposed waveforms of the cluster often showed it to be a composite of multiple units. This was resolved by doing a principal components analysis on the waveforms in that cluster: if the cluster was composite, at least one of the first few principal component weights had a multimodal histogram. The cluster was split by thresholding at the valleys of the histogram; we then tested whether any of the split components ought to be merged with an existing cluster. We developed a graphical user interface to assist the operator in performing these merging and splitting steps.</p> <a id="article1.body1.sec3.sec4.sec1.p5" name="article1.body1.sec3.sec4.sec1.p5" class="link-target"></a><p>Generally it was clear to the human operator when a band in the gui output was clean enough and wide enough (contained enough events) to generate a good cluster; thus there was no need to specify <em>a priori</em> the desired number of clusters, an advantage over many automated clustering procedures. Marginally significant clusters were either eliminated during template building (see below), or else generated fits that were themselves discarded during spike fitting (Step 3) and evaluation of template reliability (Step 4). Any significant clusters <em>missed</em> at this stage, for example because of the small fraction of the data used in this step, were found and reincorporated later during spike fitting (Step 3).</p> </div> <div id="section2" class="section toc-section"><a id="s3d2" name="s3d2" class="link-target" title="Template building"></a><h4>Template building.</h4><a id="article1.body1.sec3.sec4.sec2.p1" name="article1.body1.sec3.sec4.sec2.p1" class="link-target"></a><p>Next we created a consensus waveform (“template”) summarizing each cluster of cropped, upsampled events, and characterized meaningful deviations from that consensus. We created a draft template by finding the pointwise median over all events in a cluster, then aligned each event to the draft template by maximizing their cross-correlation over time shifts, which we found to be more accurate than aligning to each event's peak time. Finally, we found the pointwise median (to suppress the effects of outliers) of the aligned events; this waveform was our template (<a href="#pone-0019884-g005">Fig. 5B</a>).</p> <a class="link-target" id="pone-0019884-g005" name="pone-0019884-g005"></a><div class="figure" data-doi="10.1371/journal.pone.0019884.g005"><div class="img-box"><a title="Click for larger image" href="article/figure/image?size=medium&id=10.1371/journal.pone.0019884.g005" data-doi="10.1371/journal.pone.0019884" data-uri="10.1371/journal.pone.0019884.g005"><img src="article/figure/image?size=inline&id=10.1371/journal.pone.0019884.g005" alt="thumbnail" class="thumbnail" loading="lazy"></a><div class="expand"></div></div><div class="figure-inline-download"> Download: <ul><li><a href="article/figure/powerpoint?id=10.1371/journal.pone.0019884.g005"><div class="definition-label">PPT</div><div class="definition-description">PowerPoint slide</div></a></li><li><a href="article/figure/image?download&size=large&id=10.1371/journal.pone.0019884.g005"><div class="definition-label">PNG</div><div class="definition-description">larger image</div></a></li><li><a href="article/figure/image?download&size=original&id=10.1371/journal.pone.0019884.g005"><div class="definition-label">TIFF</div><div class="definition-description">original image</div></a></li></ul></div><div class="figcaption"><span>Figure 5. </span> Template building.</div><p class="caption_target"><a id="article1.body1.sec3.sec4.sec2.fig1.caption1.p1" name="article1.body1.sec3.sec4.sec2.fig1.caption1.p1" class="link-target"></a><p>(<em>A</em>) Detail of 40 of the aligned events used to compute a template, upsampled and shifted into alignment as described in the text. Some outlier traces reflect events in which this unit fired together with some other unit; the unwanted peaks occur at random times relative to the one of interest, and thus do not affect the template. (<em>B</em>) <em>Blue</em>, detail of a template waveform, showing the potential on 12 neighboring electrodes. Time in <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e058" loading="lazy" class="inline-graphic"></span> runs horizontally; the vertical axis is potential in <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e059" loading="lazy" class="inline-graphic"></span>. <em>Red</em>, for comparison, the pointwise mean of the 430 waveforms used to find this template (nearly indistinguishable from the blue curve). (<em>C</em>) Detail of (<em>A</em>), showing only the leader channel. In addition, each trace has been rescaled by a constant to emphasize their similarity apart from variation in overall amplitude.</p> </p><p class="caption_object"><a href="https://doi.org/10.1371/journal.pone.0019884.g005"> https://doi.org/10.1371/journal.pone.0019884.g005</a></p></div><a id="article1.body1.sec3.sec4.sec2.p2" name="article1.body1.sec3.sec4.sec2.p2" class="link-target"></a><p>A key step was to realize that, in our data, the most significant sources of variation of individual spikes from the template were (a) additive noise, and (b) overall multiplicative rescaling of the spike's amplitude (<a href="#pone-0019884-g005">Fig. 5C</a>). To quantify (b), we found the rescaling factor that optimized the overlap of each spike with its template, then stored the mean and variance of those factors in a lookup table for later use as a prior probability for amplitude variation. We also logged the number of events associated to each template, converted to an approximate firing rate, and saved those rates, again for later use as a prior.</p> </div> </div> <div id="section5" class="section toc-section"><a id="s3e" name="s3e" class="link-target" title="STEP 3: Spike fitting"></a> <h3>STEP 3: Spike fitting</h3> <a id="article1.body1.sec3.sec5.p1" name="article1.body1.sec3.sec5.p1" class="link-target"></a><p>The third step in our procedure was to fit the spike templates constructed in Step 2 to each firing event in the data in order to determine which neural units were responsible for the activity. To this end, we constructed a simple generative model of firing events, and included distributions of firing rate and of amplitude variation for each template. The firing probabilities and amplitude distributions were inferred from the previously clustered data, and therefore served as priors in the template fitting procedure described below. The fitting procedure iteratively identified and subtracted the most likely templates in each firing event.</p> <a id="article1.body1.sec3.sec5.p2" name="article1.body1.sec3.sec5.p2" class="link-target"></a><p>The cluster templates were produced using an upsampled <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e060" loading="lazy" class="inline-graphic"></span> sample rate, but for fitting to data we downsampled back to the actual <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e061" loading="lazy" class="inline-graphic"></span>, in each of 5 “reading frames”; that is, we created five versions of each template corresponding to subsample shifts. Let <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e062" loading="lazy" class="inline-graphic"></span> be the potential of template <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e063" loading="lazy" class="inline-graphic"></span>, on the electrode with address <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e064" loading="lazy" class="inline-graphic"></span>, at time <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e065" loading="lazy" class="inline-graphic"></span>, with time measured in units of the sampling time <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e066" loading="lazy" class="inline-graphic"></span>, and the template peak at the central point <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e067" loading="lazy" class="inline-graphic"></span> within the <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e068" loading="lazy" class="inline-graphic"></span> template frame. We use the vector notation <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e069" loading="lazy" class="inline-graphic"></span> for the template <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e070" loading="lazy" class="inline-graphic"></span> shifted to time <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e071" loading="lazy" class="inline-graphic"></span>, i.e. its <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e072" loading="lazy" class="inline-graphic"></span> component is <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e073" loading="lazy" class="inline-graphic"></span>.</p> <div id="section1" class="section toc-section"><a id="s3e1" name="s3e1" class="link-target" title="Generative model"></a><h4>Generative model.</h4><a id="article1.body1.sec3.sec5.sec1.p1" name="article1.body1.sec3.sec5.sec1.p1" class="link-target"></a><p>The goal of spike fitting is to identify, for each spike event, all the units <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e074" loading="lazy" class="inline-graphic"></span> which contribute to the event and their firing times <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e075" loading="lazy" class="inline-graphic"></span> irrespective of their amplitudes <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e076" loading="lazy" class="inline-graphic"></span>. Thus we assumed a probabilistic generative model of the data <a href="#pone.0019884-Pouzat1" class="ref-tip">[8]</a>, <a href="#pone.0019884-Lewicki1" class="ref-tip">[21]</a>–<a href="#pone.0019884-Sahani1" class="ref-tip">[23]</a> and computed the posterior probability of <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e077" loading="lazy" class="inline-graphic"></span> given the observed data. We assumed that a spike event <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e078" loading="lazy" class="inline-graphic"></span> could be explained by a linear combination of templates <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e079" loading="lazy" class="inline-graphic"></span> with variable amplitudes <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e080" loading="lazy" class="inline-graphic"></span> and correlated, zero-mean Gaussian noise <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e081" loading="lazy" class="inline-graphic"></span>:<a name="" id="" class="link-target"></a><span class="equation"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e082" loading="lazy" class="inline-graphic"><span class="note">(1)</span></span>Here <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e083" loading="lazy" class="inline-graphic"></span> is the (a priori unknown) number of units contributing to the event. Given this model, to obtain the posterior probability that a firing event consists of a particular set of templates, we need to specify the prior probability of <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e084" loading="lazy" class="inline-graphic"></span>, <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e085" loading="lazy" class="inline-graphic"></span>, and <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e086" loading="lazy" class="inline-graphic"></span>. We chose a Gaussian prior for the amplitude <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e087" loading="lazy" class="inline-graphic"></span>, a Poisson prior for <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e088" loading="lazy" class="inline-graphic"></span>, and a uniform prior for <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e089" loading="lazy" class="inline-graphic"></span>. Although <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e090" loading="lazy" class="inline-graphic"></span> is a strictly positive quantity, we modeled its distribution with a Gaussian for analytical tractability. In practice, the distribution of <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e091" loading="lazy" class="inline-graphic"></span> was tightly concentrated around its mean of approximately <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e092" loading="lazy" class="inline-graphic"></span> and the Gaussian approximation had negligible weight at negative values (<a href="#pone-0019884-g006">Fig. 6D</a>).</p> <a class="link-target" id="pone-0019884-g006" name="pone-0019884-g006"></a><div class="figure" data-doi="10.1371/journal.pone.0019884.g006"><div class="img-box"><a title="Click for larger image" href="article/figure/image?size=medium&id=10.1371/journal.pone.0019884.g006" data-doi="10.1371/journal.pone.0019884" data-uri="10.1371/journal.pone.0019884.g006"><img src="article/figure/image?size=inline&id=10.1371/journal.pone.0019884.g006" alt="thumbnail" class="thumbnail" loading="lazy"></a><div class="expand"></div></div><div class="figure-inline-download"> Download: <ul><li><a href="article/figure/powerpoint?id=10.1371/journal.pone.0019884.g006"><div class="definition-label">PPT</div><div class="definition-description">PowerPoint slide</div></a></li><li><a href="article/figure/image?download&size=large&id=10.1371/journal.pone.0019884.g006"><div class="definition-label">PNG</div><div class="definition-description">larger image</div></a></li><li><a href="article/figure/image?download&size=original&id=10.1371/journal.pone.0019884.g006"><div class="definition-label">TIFF</div><div class="definition-description">original image</div></a></li></ul></div><div class="figcaption"><span>Figure 6. </span> After fitting spikes, only noise remains.</div><p class="caption_target"><a id="article1.body1.sec3.sec5.sec1.fig1.caption1.p1" name="article1.body1.sec3.sec5.sec1.fig1.caption1.p1" class="link-target"></a><p>(<em>A</em>) Noise covariance after spatial whitening. Subpanels: spacetime covariance <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e093" loading="lazy" class="inline-graphic"></span> between the central channel and its neighbors as a function of <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e094" loading="lazy" class="inline-graphic"></span>, for various fixed <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e095" loading="lazy" class="inline-graphic"></span> (colored curves). Central panel (dotted line): the function <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e096" loading="lazy" class="inline-graphic"></span>. (The various <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e097" loading="lazy" class="inline-graphic"></span> lines and the dotted line are too similar to discriminate visually.) Horizontal axes: <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e098" loading="lazy" class="inline-graphic"></span> in <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e099" loading="lazy" class="inline-graphic"></span>; Vertical axes: <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e100" loading="lazy" class="inline-graphic"></span> in <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e101" loading="lazy" class="inline-graphic"></span>. (<em>B</em>) <em>Blue curve</em>, Semilog plot of the one point marginal probability density function of decorrelated noise samples. <em>Red curve</em>, same quantity, evaluated on residuals after spikes have been removed from spike events. <em>Dotted curve</em>, The Gaussian chosen to represent this distribution. (<em>C</em>) <em>Green</em>, detail of the same template waveform shown in <a href="#pone-0019884-g005">Fig. 5</a>. <em>Red</em>, pointwise mean of the residuals after the fit spike is subtracted from 4,906 one-spike events of this type is nearly flat. This validates our assumption that spikes vary only in overall amplitude, and that noise is independent of spiking. <em>Blue</em>, pointwise standard deviation of the residuals, again evidence that only noise remains after fitting and subtracting spikes. (<em>D</em>, <em>top</em>) Histogram of fit values of the scale factor <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e102" loading="lazy" class="inline-graphic"></span> for a template with peak amplitude <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e103" loading="lazy" class="inline-graphic"></span> (well above noise) obtained without a prior on <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e104" loading="lazy" class="inline-graphic"></span>, superposed with a Gaussian of the same mean and variance. (<em>D</em>, <em>bottom</em>) Similar histogram for a low amplitude template. A secondary bump appears, due to noise-fits, but is well separated from the main peak; a cutoff is shown as a dashed green line. The superposed Gaussian has mean and variance computed from the part of the empirical distribution lying above the cutoff.</p> </p><p class="caption_object"><a href="https://doi.org/10.1371/journal.pone.0019884.g006"> https://doi.org/10.1371/journal.pone.0019884.g006</a></p></div><a id="article1.body1.sec3.sec5.sec1.p2" name="article1.body1.sec3.sec5.sec1.p2" class="link-target"></a><p>Our generative model assumes that spike waveforms from a given neural unit are stereotyped, apart from their amplitude. We did observe considerable variation in spike amplitude (<a href="#pone-0019884-g002">Fig. 2A</a>), in part due to bursting <a href="#pone.0019884-Fee1" class="ref-tip">[10]</a>, <a href="#pone.0019884-Harris1" class="ref-tip">[12]</a>, and thus included it in the model as a distribution of amplitude rescaling factors. Allowing for the possibility of slight variations in spike width (<a href="#pone.0019884.s001">Text S1</a> Sect. F) also slightly improved our results. But there was little additional variability to be modelled (<a href="#pone-0019884-g005">Fig. 5C</a>). Our model also assumes that signals from different units combine linearly, as does the noise. This is reasonable, because the biophysics of extracellular recording is governed by the equations of electrodynamics, Ohm's law, and other linear relations. A third assumption is that noise and the variability of spike amplitude are each well described by Gaussian distributions. Assuming Gaussianity (well-confirmed in some settings <a href="#pone.0019884-Pouzat1" class="ref-tip">[8]</a>, but not others <a href="#pone.0019884-Shoham1" class="ref-tip">[24]</a>) allows for a fast, partially analytic approach to fitting. We validate this assumption quantitatively below.</p> <a id="article1.body1.sec3.sec5.sec1.p3" name="article1.body1.sec3.sec5.sec1.p3" class="link-target"></a><p>Our generative model has a Poisson prior probability for firing by each neural unit, i.e. a prior that is as unstructured as possible while being consistent with the mean firing rate. The prior probability could be made somewhat more accurate by including refractory periods, the likelihood of bursting, and correlations between neural units. But this would significantly increase the complexity of the model, and inferring the distribution would require much more data <a href="#pone.0019884-Schneidman1" class="ref-tip">[25]</a>.</p> <a id="article1.body1.sec3.sec5.sec1.p4" name="article1.body1.sec3.sec5.sec1.p4" class="link-target"></a><p>Finally, we assumed that all statistical distributions that enter into the model are stationary and independent of the stimulus. While our retinal preparation does not suffer electrode drift (as might implanted electrodes), there are occasionally shifts in spike amplitudes and firing rates over the course of a lengthy experiment. Although in principle our fixed priors could lead to biased estimates, these biases are small when spike identification is robust, i.e. when the likelihood function dominates the prior in the posterior probability of a neural unit <a href="#pone.0019884-Ventura1" class="ref-tip">[26]</a>.</p> </div> <div id="section2" class="section toc-section"><a id="s3e2" name="s3e2" class="link-target" title="Noise characterization"></a><h4>Noise characterization.</h4><a id="article1.body1.sec3.sec5.sec2.p1" name="article1.body1.sec3.sec5.sec2.p1" class="link-target"></a><p>In the context of our generative model, in order to assess the probability that the residual after subtracting a putative spike is indeed noise, we first need to measure the distribution of noise. After applying the spatial whitening filter (described in Step 1), our noise clips are decorrelated in space, but not in time (<a href="#pone-0019884-g006">Fig. 6A</a>). Assuming that the noise has a correlated Gaussian distribution, we need the inverse of the noise covariance matrix, <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e105" loading="lazy" class="inline-graphic"></span>. One approach to finding <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e106" loading="lazy" class="inline-graphic"></span> is to invert the empirical covariance matrix <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e107" loading="lazy" class="inline-graphic"></span> of a large set of noise clips. Besides being intractable for larger arrays, this approach has the disadvantage that a numerically stable evaluation requires a very large noise sample.</p> <a id="article1.body1.sec3.sec5.sec2.p2" name="article1.body1.sec3.sec5.sec2.p2" class="link-target"></a><p>For these reasons we instead took a parametric approach. After evaluating the covariance <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e108" loading="lazy" class="inline-graphic"></span> we noted that it was approximately diagonal and translation-invariant in space (i.e. proportional to <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e109" loading="lazy" class="inline-graphic"></span> and independent of <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e110" loading="lazy" class="inline-graphic"></span> and <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e111" loading="lazy" class="inline-graphic"></span>). It was also approximately stationary, i.e. invariant under time shifts <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e112" loading="lazy" class="inline-graphic"></span>, <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e113" loading="lazy" class="inline-graphic"></span>, and thus only depended on <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e114" loading="lazy" class="inline-graphic"></span>. Finally, we observed that the time dependence of <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e115" loading="lazy" class="inline-graphic"></span> was roughly an exponential, <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e116" loading="lazy" class="inline-graphic"></span> (<a href="#pone-0019884-g006">Fig. 6A</a>). This gave:<a name="" id="" class="link-target"></a><span class="equation"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e117" loading="lazy" class="inline-graphic"><span class="note">(2)</span></span>Here <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e118" loading="lazy" class="inline-graphic"></span> is the sample time, and <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e119" loading="lazy" class="inline-graphic"></span> is the Kronecker symbol. <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e120" loading="lazy" class="inline-graphic"></span> and <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e121" loading="lazy" class="inline-graphic"></span> are obtained from the noise covariance. The dataset used in <a href="#s2">Results</a> yields noise strength <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e122" loading="lazy" class="inline-graphic"></span> and <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e123" loading="lazy" class="inline-graphic"></span>.</p> <a id="article1.body1.sec3.sec5.sec2.p3" name="article1.body1.sec3.sec5.sec2.p3" class="link-target"></a><p>By construction, our noise model reproduces the 2-point correlations in the noise clips. However, real noise may not be Gaussian distributed. One check on this is to construct the transformed quantities <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e124" loading="lazy" class="inline-graphic"></span> empirically, find their full distribution as <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e125" loading="lazy" class="inline-graphic"></span> ranges over noise clips (the “one-point marginal” distribution), and compare to a normal distribution. <a href="#pone-0019884-g006">Fig. 6B</a> shows this comparison, lumping together every element of <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e126" loading="lazy" class="inline-graphic"></span>. The empirical noise deviates from a Gaussian only in the far tails that contain very little weight.</p> </div> <div id="section3" class="section toc-section"><a id="s3e3" name="s3e3" class="link-target" title="Fitting algorithm for single spikes"></a><h4>Fitting algorithm for single spikes.</h4><a id="article1.body1.sec3.sec5.sec3.p1" name="article1.body1.sec3.sec5.sec3.p1" class="link-target"></a><p>Given the above characterization of the noise distribution, and our Gaussian prior for spike amplitude variation, the generative model Eqn. 1 defined the posterior probability <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e127" loading="lazy" class="inline-graphic"></span> for templates <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e128" loading="lazy" class="inline-graphic"></span> to be present at times <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e129" loading="lazy" class="inline-graphic"></span> with amplitude scale factors <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e130" loading="lazy" class="inline-graphic"></span>, given the recorded potentials <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e131" loading="lazy" class="inline-graphic"></span>. We ideally would have marginalized <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e132" loading="lazy" class="inline-graphic"></span> over the nuisance parameters <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e133" loading="lazy" class="inline-graphic"></span> and then maximized with respect to <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e134" loading="lazy" class="inline-graphic"></span> to identify the most probable set of units and spike times. In practice, this maximization is computationally expensive to perform on many templates simultaneously. Instead, we used a greedy approximation which fit one template at a time.</p> <a id="article1.body1.sec3.sec5.sec3.p2" name="article1.body1.sec3.sec5.sec3.p2" class="link-target"></a><p>We first assumed that the event contained exactly one spike and identified the spike's type <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e135" loading="lazy" class="inline-graphic"></span> and time of occurrence <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e136" loading="lazy" class="inline-graphic"></span>. Bayes' formula gives for the posterior probability:<a name="" id="" class="link-target"></a><span class="equation"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e137" loading="lazy" class="inline-graphic"><span class="note">(3)</span></span>up to a constant independent of <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e138" loading="lazy" class="inline-graphic"></span>, <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e139" loading="lazy" class="inline-graphic"></span>, and <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e140" loading="lazy" class="inline-graphic"></span>. Here <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e141" loading="lazy" class="inline-graphic"></span> is the prior probability of the template <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e142" loading="lazy" class="inline-graphic"></span> appearing at time <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e143" loading="lazy" class="inline-graphic"></span> with an amplitude <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e144" loading="lazy" class="inline-graphic"></span>:<a name="" id="" class="link-target"></a><span class="equation"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e145" loading="lazy" class="inline-graphic"><span class="note">(4)</span></span>where <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e146" loading="lazy" class="inline-graphic"></span> is the mean and <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e147" loading="lazy" class="inline-graphic"></span> the variance of the scale factor for cluster <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e148" loading="lazy" class="inline-graphic"></span>; <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e149" loading="lazy" class="inline-graphic"></span> is the estimated overall rate of firing for this cluster. The generative model gave the probability of the observed potential <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e150" loading="lazy" class="inline-graphic"></span> given <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e151" loading="lazy" class="inline-graphic"></span> (the likelihood) as <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e152" loading="lazy" class="inline-graphic"></span> where <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e153" loading="lazy" class="inline-graphic"></span> is a Gaussian distribution with zero mean and covariance <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e154" loading="lazy" class="inline-graphic"></span> (Eqn. 2). Combining the likelihood and prior, then integrating out <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e155" loading="lazy" class="inline-graphic"></span>, gave the formula we ultimately used in our fitting algorithm:<a name="" id="" class="link-target"></a><span class="equation"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e156" loading="lazy" class="inline-graphic"><span class="note">(5)</span></span>We have expressed Eqn. 5 as a ratio with the probability that no templates contributed to the event. Finally, we varied <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e157" loading="lazy" class="inline-graphic"></span> and <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e158" loading="lazy" class="inline-graphic"></span> to find the template and time which maximized Eqn. 5. This gave the first fit template, <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e159" loading="lazy" class="inline-graphic"></span>, its firing time, <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e160" loading="lazy" class="inline-graphic"></span>, and the probability ratio of the fit.</p> <a id="article1.body1.sec3.sec5.sec3.p3" name="article1.body1.sec3.sec5.sec3.p3" class="link-target"></a><p>We improved scalability by a slight approximation. Starting from a spike event, we first identified the time and electrode address of its absolute peak and restricted the matrix products in expression Eqn. 5 to only sum over a spatiotemporal neighborhood surrounding this peak. The size of the neighborhood was chosen to match the typical spatial extent and temporal duration of the templates.</p> </div> <div id="section4" class="section toc-section"><a id="s3e4" name="s3e4" class="link-target" title="Multiple spikes"></a><h4>Multiple spikes.</h4><a id="article1.body1.sec3.sec5.sec4.p1" name="article1.body1.sec3.sec5.sec4.p1" class="link-target"></a><p>In principle, we could have extended the single template procedure described above to compare the probabilities of all possible combinations of two or more spikes. Such an exhaustive approach, however, would quickly have become impractical. We instead noted that, even if an event contains multiple spikes, the single-spike fit described above still identified that template whose removal would lead to the largest increase in the probability that the remaining waveform is noise. Thus we adopted an iterative (matching-pursuit or “greedy”) approach: starting with a spike event, we found the absolute peak, fit it by the method described above, subtracted the fit, and then repeated the process <a href="#pone.0019884-Segev1" class="ref-tip">[7]</a>.</p> <a id="article1.body1.sec3.sec5.sec4.p2" name="article1.body1.sec3.sec5.sec4.p2" class="link-target"></a><p>The single-spike procedure found the most probable spike type <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e161" loading="lazy" class="inline-graphic"></span>; we then computed the scale factor <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e162" loading="lazy" class="inline-graphic"></span> and spike time <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e163" loading="lazy" class="inline-graphic"></span> that would allow the fit spike to be subtracted as fully as possible. We thus held <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e164" loading="lazy" class="inline-graphic"></span> fixed to <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e165" loading="lazy" class="inline-graphic"></span> and minimized the ordinary norm <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e166" loading="lazy" class="inline-graphic"></span> over <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e167" loading="lazy" class="inline-graphic"></span> and <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e168" loading="lazy" class="inline-graphic"></span>. The scaled and shifted template obtained in this way was subtracted before repeating the single-spike fitting procedure. The parameter <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e169" loading="lazy" class="inline-graphic"></span> was only used for template subtraction. The spike time which was actually reported by the algorithm was not <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e170" loading="lazy" class="inline-graphic"></span>, but <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e171" loading="lazy" class="inline-graphic"></span> described above. In practice, <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e172" loading="lazy" class="inline-graphic"></span> was always very close to <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e173" loading="lazy" class="inline-graphic"></span>.</p> <a id="article1.body1.sec3.sec5.sec4.p3" name="article1.body1.sec3.sec5.sec4.p3" class="link-target"></a><p>To determine when to stop fitting spikes, we adopted a likelihood ratio test. At each step of the fitting loop, we summed Eqn. 5 over <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e174" loading="lazy" class="inline-graphic"></span>, obtaining the probability ratio that an additional spike of type <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e175" loading="lazy" class="inline-graphic"></span> is present relative to the probability that <em>no</em> additional spike was present. We can then say that fitting an additional spike is justified if the ratio exceeds unity for some <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e176" loading="lazy" class="inline-graphic"></span>. The fitting loop terminates when the significance test fails. Note that the factor <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e177" loading="lazy" class="inline-graphic"></span> (the prior probability of a spike from unit <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e178" loading="lazy" class="inline-graphic"></span>) in Eqn. 5 is typically much smaller than one. In order for the fitting algorithm to accept a candidate spike, the remaining terms in Eqn. 5, which relate to goodness-of-fit, must be large enough to overcome this small factor. Furthermore, the amplitude prior is typically concentrated tightly around its mean. The marginalization over amplitudes thus suppresses templates that would have to stretch by a large factor in order to fit the data. Both of these effects counteract overfitting. <a href="#pone-0019884-g004">Fig. 4C,D</a> shows an example of the successful decomposition of a multiple-spike event using our method.</p> </div> <div id="section5" class="section toc-section"><a id="s3e5" name="s3e5" class="link-target" title="Second pass"></a><h4>Second pass.</h4><a id="article1.body1.sec3.sec5.sec5.p1" name="article1.body1.sec3.sec5.sec5.p1" class="link-target"></a><p>The spike fitting algorithm might exit prematurely if a spike is present that does not appear in the list of templates initially extracted from the small subset of data. In this case, the fit will terminate, even though other identifiable spikes of lower amplitude may remain. To check this, if the residual exceeds <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e179" loading="lazy" class="inline-graphic"></span> after termination, the code declares an “incomplete fit” and writes the residual to a file; the small set of resulting waveforms were then reintroduced into our clustering code and used for a second round of fitting. In this way we can be assured of finding even rare spike types, without having to perform clustering on the complete dataset. Using this method, only <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e180" loading="lazy" class="inline-graphic"></span> of fits in the second pass were classified as incomplete. It can also happen that the small data sample used for clustering gives a poor estimate of some firing rates and amplitude distributions that enter our priors for spike fitting. Thus, before the second pass of fitting the priors are updated based on the outcome of the first pass.</p> </div> </div> <div id="section6" class="section toc-section"><a id="s3f" name="s3f" class="link-target" title="STEP 4: Evaluation of template reliability"></a> <h3>STEP 4: Evaluation of template reliability</h3> <a id="article1.body1.sec3.sec6.p1" name="article1.body1.sec3.sec6.p1" class="link-target"></a><p>After spike identification, we performed a final evaluation to test whether templates and their sorted spike trains were trustworthy. The primary criteria were: (1) residuals after spike removal should resemble noise, (2) the histogram of amplitude scale factors should be unimodal, (3) the inter-spike interval (ISI) distributions should display “refractory holes”; and the cross-correlation functions should not. Additional criteria are described in <a href="#pone.0019884.s001">Text S1</a> Sect. H. Reliable templates were taken to be those that passed all these tests. Most unreliable templates failed multiple tests.</p> <div id="section1" class="section toc-section"><a id="s3f1" name="s3f1" class="link-target" title="Residuals"></a><h4>Residuals.</h4><a id="article1.body1.sec3.sec6.sec1.p1" name="article1.body1.sec3.sec6.sec1.p1" class="link-target"></a><p>For single-spike events, the residual signal after subtracting the fit should resemble pure noise; in particular it should be stationary in time and translation-invariant in space. <a href="#pone-0019884-g006">Fig. 6C</a> shows that these expectations were met, validating our assumptions. For example, if the unit in <a href="#pone-0019884-g006">Fig. 6C</a> had significant variations other than amplitude rescaling, or if there had been an amplitude-dependent noise process, then we would expect significant non-stationarity in the residual curves <a href="#pone.0019884-Lewicki1" class="ref-tip">[21]</a>. To test that, after termination, the residual of a spike event consists only of noise, we computed the one-point marginal distribution of waveforms after all known spikes had been removed. <a href="#pone-0019884-g006">Fig. 6B</a> shows that this distribution closely resembled that of noise clips, indicating that our code indeed found the significant spikes. Of particular note, the standard deviation of the residuals matched that of the noise: For each template, we found the standard deviation of the residuals of events to which only that template was fit. This value ranged from <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e181" loading="lazy" class="inline-graphic"></span> to <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e182" loading="lazy" class="inline-graphic"></span>, while the noise standard deviation was <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e183" loading="lazy" class="inline-graphic"></span>.</p> </div> <div id="section2" class="section toc-section"><a id="s3f2" name="s3f2" class="link-target" title="Amplitude"></a><h4>Amplitude.</h4><a id="article1.body1.sec3.sec6.sec2.p1" name="article1.body1.sec3.sec6.sec2.p1" class="link-target"></a><p>For large amplitude templates, the distribution of amplitude scale factors (<span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e184" loading="lazy" class="inline-graphic"></span>) obtained during spike fitting was typically close to Gaussian (<a href="#pone-0019884-g006">Fig. 6D</a>). On the other hand, for low amplitude templates, accidental noise fits can sometimes lead to a histogram of <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e185" loading="lazy" class="inline-graphic"></span> values with a secondary, low-amplitude peak well separated from the expected peak near <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e186" loading="lazy" class="inline-graphic"></span> (<a href="#pone-0019884-g006">Fig. 6D</a>). Examining the <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e187" loading="lazy" class="inline-graphic"></span> histograms allowed us to quickly set an individual threshold for each reliable template. Fit spikes with <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e188" loading="lazy" class="inline-graphic"></span> value below this threshold were discarded. If two peaks were discernible but overlapped significantly, the entire cluster was deemed unreliable and its spikes were not used in further analysis. In addition, our trigger rejected any spike event that did not cross <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e189" loading="lazy" class="inline-graphic"></span>, thus any cluster whose <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0019884.e190" loading="lazy" class="inline-graphic"></span> histogram extended closer to zero than this was probably missing some true spikes, and was not used.</p> </div> <div id="section3" class="section toc-section"><a id="s3f3" name="s3f3" class="link-target" title="ISI distribution and cross-correlation"></a><h4>ISI distribution and cross-correlation.</h4><a id="article1.body1.sec3.sec6.sec3.p1" name="article1.body1.sec3.sec6.sec3.p1" class="link-target"></a><p>Interspike interval distributions for single units are expected to have a refractory hole; our analysis of these distributions was described in <a href="#s2">Results</a>. Two distinct neural units need not respect any mutual refractory period. Their spike-time cross-correlation function is therefore <em>not</em> expected to display any hole. We looked for such unexpected behavior and, when found, reexamined the corresponding templates. If the templates appeared to be duplicates, we merged the corresponding spike trains <a href="#pone.0019884-Segev1" class="ref-tip">[7]</a>, <a href="#pone.0019884-Litke1" class="ref-tip">[9]</a>. Another diagnostic for duplicate templates is a coincident receptive field.</p> </div> </div> </div> <div xmlns:plos="http://plos.org" id="section4" class="section toc-section"><a id="s4" name="s4" data-toc="s4" class="link-target" title="Discussion"></a><h2>Discussion</h2><a id="article1.body1.sec4.p1" name="article1.body1.sec4.p1" class="link-target"></a><p>A review of early work on spike identification, prior to the widespread use of MEAs, can be found in <a href="#pone.0019884-Lewicki2" class="ref-tip">[27]</a>. Like some earlier work, our method separates spike identification into distinct steps of clustering and fitting. The clustering step uses all the waveform features, and makes no assumption about the cluster structure (e.g., that it is a mixture of Gaussian distributions). The fitting step acknowledges that each neural unit's signals are subject to intrinsic, multiplicative variation as well as additive noise, and uses a Bayesian approach to infer the identity of the most likely firing unit.</p> <a id="article1.body1.sec4.p2" name="article1.body1.sec4.p2" class="link-target"></a><p>Our approach is intentionally not fully automatic, since human proof-reading of the results of automated clustering is generally essential. However, we have been careful to use human judgement only where it is indispensable. Further, both the human and machine steps are organized so as to scale well with array area (or number of units monitored). For example, cluster cutting was greatly simplified by representing spikes in an ordered one-dimensional array. This feature, along with systematic exploitation of the spatio-temporal locality of spikes (<a href="#pone-0019884-g002">Fig. 2A</a>), and the use of a simple but powerful generative model, make our method scalable to large arrays. Furthermore, we observed that our more ambiguous templates tended to be located on the boundary of the array due to recording of units located some distance from the electrodes. These “boundary effects” should become less important for larger arrays; we thus anticipate that the methods described in this paper will yield more accurate spike sorting for large, dense arrays.</p> <a id="article1.body1.sec4.p3" name="article1.body1.sec4.p3" class="link-target"></a><p>Our method can be extended in many ways. For example, it would be straightforward to update the priors continually as fitting proceeds, allowing non-stationarity and stimulus dependence to be handled more gracefully. In some applications it may be preferable to report spike identification probabilistically, rather than just listing the most-likely spike events; our formulas already provide this information. The method can also be extended to non-planar arrangements of electrodes and neural tissues, for, e.g., cortical applications. Finally, the generative model in the present paper does not take into account correlations within and between spike trains, or the receptive field structure and stimulus dependence of responses. Performance could be further improved on complex overlapping spike events via a bootstrapping procedure. We could first use the simple independent, Poisson generative model of this article to produce an accurate preliminary assignment of spikes to units. From this assignment we could construct a more detailed model of correlated activity with pairwise interactions (e.g. <a href="#pone.0019884-Schneidman1" class="ref-tip">[25]</a> or the stimulus-dependent models <a href="#pone.0019884-Pillow1" class="ref-tip">[28]</a>, <a href="#pone.0019884-Tkaficik1" class="ref-tip">[29]</a>). This more complex generative model could then be used to further refine spike assignments for applications requiring a very high degree of accuracy.</p> </div> <div xmlns:plos="http://plos.org" id="section5" class="section toc-section"><a id="s5" name="s5" data-toc="s5" class="link-target" title="Supporting Information"></a><h2>Supporting Information</h2><div class="figshare_widget" doi="10.1371/journal.pone.0019884"></div><div class="supplementary-material"><a name="pone.0019884.s001" id="pone.0019884.s001" class="link-target"></a><h3 class="siTitle title-small"><a href="article/file?type=supplementary&id=10.1371/journal.pone.0019884.s001">Text S1. </a></h3><a id="article1.body1.sec5.supplementary-material1.caption1.p1" name="article1.body1.sec5.supplementary-material1.caption1.p1" class="link-target"></a><p class="preSiDOI">Supplementary appendix describing additional methodological details.</p> <p class="siDoi"><a href="https://doi.org/10.1371/journal.pone.0019884.s001">https://doi.org/10.1371/journal.pone.0019884.s001</a></p><a id="article1.body1.sec5.supplementary-material1.caption1.p2" name="article1.body1.sec5.supplementary-material1.caption1.p2" class="link-target"></a><p class="postSiDOI">(PDF)</p> </div></div> <div xmlns:plos="http://plos.org" class="section toc-section"><a id="ack" name="ack" data-toc="ack" title="Acknowledgments" class="link-target"></a><h2>Acknowledgments</h2> <a id="article1.back1.ack1.p1" name="article1.back1.ack1.p1" class="link-target"></a><p>Michael Berry and Olivier Marre have developed an algorithm similar to, but different from, ours (manuscript in preparation). We thank them for discussions of their work, and specifically thank Olivier Marre for suggesting to us that the most complete subtraction of a spike can be obtained by refitting the spike without a prior.</p> </div><div xmlns:plos="http://plos.org" class="contributions toc-section"><a id="authcontrib" name="authcontrib" data-toc="authcontrib" title="Author Contributions"></a><h2>Author Contributions</h2><p>Conceived and designed the experiments: JSP JH KDS GT VB PCN. Performed the experiments: JSP KDS. Analyzed the data: JSP JH KDS PCN. Contributed reagents/materials/analysis tools: JSP JH PCN. Wrote the paper: JSP VB PCN.</p></div><div xmlns:plos="http://plos.org" class="toc-section"><a id="references" name="references" class="link-target" data-toc="references" title="References"></a><h2>References</h2><ol class="references"><li id="ref1"><span class="order">1. </span><a name="pone.0019884-Sterlng1" id="pone.0019884-Sterlng1" class="link-target"></a>Sterlng P Chalupa L, Werner J, editors. (2004) How retinal circuits optimize the transfer of visual information. The Visual Neurosciences. <ul class="reflinks"><li><a href="#" data-author="Sterlng%20Chalupa" data-cit="SterlngP2004How%20retinal%20circuits%20optimize%20the%20transfer%20of%20visual%20information.ChalupaLWernerJThe%20Visual%20Neurosciences" data-title="How%20retinal%20circuits%20optimize%20the%20transfer%20of%20visual%20information." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=How+retinal+circuits+optimize+the+transfer+of+visual+information.+Sterlng+Chalupa+2004" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref2"><span class="order">2. </span><a name="pone.0019884-Meister1" id="pone.0019884-Meister1" class="link-target"></a>Meister M, Pine J, Baylor DA (1994) Multi-neuronal signals from the retina: Acquisition and analysis. J Neurosci Methods 51: 95–106. <ul class="reflinks"><li><a href="#" data-author="Meister" data-cit="MeisterMPineJBaylorDA1994Multi-neuronal%20signals%20from%20the%20retina%3A%20Acquisition%20and%20analysis.J%20Neurosci%20Methods5195106" data-title="Multi-neuronal%20signals%20from%20the%20retina%3A%20Acquisition%20and%20analysis." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=Multi-neuronal+signals+from+the+retina%3A+Acquisition+and+analysis.+Meister+1994" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref3"><span class="order">3. </span><a name="pone.0019884-Devries1" id="pone.0019884-Devries1" class="link-target"></a>Devries S, Baylor D (1997) Mosaic arrangement of ganglion cell receptive fields in rabbit retina. J Neurophysiol 78: 2048. <ul class="reflinks"><li><a href="#" data-author="Devries" data-cit="DevriesSBaylorD1997Mosaic%20arrangement%20of%20ganglion%20cell%20receptive%20fields%20in%20rabbit%20retina.J%20Neurophysiol782048" data-title="Mosaic%20arrangement%20of%20ganglion%20cell%20receptive%20fields%20in%20rabbit%20retina." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=Mosaic+arrangement+of+ganglion+cell+receptive+fields+in+rabbit+retina.+Devries+1997" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref4"><span class="order">4. </span><a name="pone.0019884-Buzski1" id="pone.0019884-Buzski1" class="link-target"></a>Buzsáki G (2004) Large-scale recording of neuronal ensembles. Nature Neuroscience 7: 446–51. <ul class="reflinks"><li><a href="#" data-author="Buzs%C3%A1ki" data-cit="Buzs%C3%A1kiG2004Large-scale%20recording%20of%20neuronal%20ensembles.Nature%20Neuroscience744651" data-title="Large-scale%20recording%20of%20neuronal%20ensembles." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=Large-scale+recording+of+neuronal+ensembles.+Buzs%C3%A1ki+2004" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref5"><span class="order">5. </span><a name="pone.0019884-Gray1" id="pone.0019884-Gray1" class="link-target"></a>Gray CM, Maldonado PE, Wilson M, McNaughton B (1995) Tetrodes markedly improve the reliability and yield of multiple single-unit isolation from multi-unit recordings in cat striate cortex. J Neurosci Methods 63: 43–54. <ul class="reflinks"><li><a href="#" data-author="Gray" data-cit="GrayCMMaldonadoPEWilsonMMcNaughtonB1995Tetrodes%20markedly%20improve%20the%20reliability%20and%20yield%20of%20multiple%20single-unit%20isolation%20from%20multi-unit%20recordings%20in%20cat%20striate%20cortex.J%20Neurosci%20Methods634354" data-title="Tetrodes%20markedly%20improve%20the%20reliability%20and%20yield%20of%20multiple%20single-unit%20isolation%20from%20multi-unit%20recordings%20in%20cat%20striate%20cortex." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=Tetrodes+markedly+improve+the+reliability+and+yield+of+multiple+single-unit+isolation+from+multi-unit+recordings+in+cat+striate+cortex.+Gray+1995" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref6"><span class="order">6. </span><a name="pone.0019884-Mallat1" id="pone.0019884-Mallat1" class="link-target"></a>Mallat SG, Zhang ZF (1993) Matching pursuits with time-frequency dictionaries. IEEE Transactions on Signal Processing 41: 3397–3415. <ul class="reflinks"><li><a href="#" data-author="Mallat" data-cit="MallatSGZhangZF1993Matching%20pursuits%20with%20time-frequency%20dictionaries.IEEE%20Transactions%20on%20Signal%20Processing4133973415" data-title="Matching%20pursuits%20with%20time-frequency%20dictionaries." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=Matching+pursuits+with+time-frequency+dictionaries.+Mallat+1993" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref7"><span class="order">7. </span><a name="pone.0019884-Segev1" id="pone.0019884-Segev1" class="link-target"></a>Segev R, Goodhouse J, Puchalla J, Berry MJ (2004) Recording spikes from a large fraction of the ganglion cells in a retinal patch. Nature Neuroscience 7: 1154–61. <ul class="reflinks"><li><a href="#" data-author="Segev" data-cit="SegevRGoodhouseJPuchallaJBerryMJ2004Recording%20spikes%20from%20a%20large%20fraction%20of%20the%20ganglion%20cells%20in%20a%20retinal%20patch.Nature%20Neuroscience7115461" data-title="Recording%20spikes%20from%20a%20large%20fraction%20of%20the%20ganglion%20cells%20in%20a%20retinal%20patch." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=Recording+spikes+from+a+large+fraction+of+the+ganglion+cells+in+a+retinal+patch.+Segev+2004" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref8"><span class="order">8. </span><a name="pone.0019884-Pouzat1" id="pone.0019884-Pouzat1" class="link-target"></a>Pouzat C, Mazor O, Laurent G (2002) Using noise signature to optimize spike-sorting and to assess neuronal classification quality. J Neurosci Methods 122: 43–57. <ul class="reflinks"><li><a href="#" data-author="Pouzat" data-cit="PouzatCMazorOLaurentG2002Using%20noise%20signature%20to%20optimize%20spike-sorting%20and%20to%20assess%20neuronal%20classification%20quality.J%20Neurosci%20Methods1224357" data-title="Using%20noise%20signature%20to%20optimize%20spike-sorting%20and%20to%20assess%20neuronal%20classification%20quality." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=Using+noise+signature+to+optimize+spike-sorting+and+to+assess+neuronal+classification+quality.+Pouzat+2002" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref9"><span class="order">9. </span><a name="pone.0019884-Litke1" id="pone.0019884-Litke1" class="link-target"></a>Litke AM, Bezayiff N, Chichilnisky EJ, Cunningham W, Dabrowski W, et al. (2004) What does the eye tell the brain?: Development of a system for the large scale recording of retinal output activity. IEEE Trans Nucl Sci 51: 1434–1439. <ul class="reflinks"><li><a href="#" data-author="Litke" data-cit="LitkeAMBezayiffNChichilniskyEJCunninghamWDabrowskiW2004What%20does%20the%20eye%20tell%20the%20brain%3F%3A%20Development%20of%20a%20system%20for%20the%20large%20scale%20recording%20of%20retinal%20output%20activity.IEEE%20Trans%20Nucl%20Sci5114341439" data-title="What%20does%20the%20eye%20tell%20the%20brain%3F%3A%20Development%20of%20a%20system%20for%20the%20large%20scale%20recording%20of%20retinal%20output%20activity." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=What+does+the+eye+tell+the+brain%3F%3A+Development+of+a+system+for+the+large+scale+recording+of+retinal+output+activity.+Litke+2004" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref10"><span class="order">10. </span><a name="pone.0019884-Fee1" id="pone.0019884-Fee1" class="link-target"></a>Fee MS, Mitra P, Kleinfeld D (1996) Automatic sorting of multiple unit neuronal signals in the presence of anisotropic and non-gaussian variability. J Neurosci Methods 69: 175–188. <ul class="reflinks"><li><a href="#" data-author="Fee" data-cit="FeeMSMitraPKleinfeldD1996Automatic%20sorting%20of%20multiple%20unit%20neuronal%20signals%20in%20the%20presence%20of%20anisotropic%20and%20non-gaussian%20variability.J%20Neurosci%20Methods69175188" data-title="Automatic%20sorting%20of%20multiple%20unit%20neuronal%20signals%20in%20the%20presence%20of%20anisotropic%20and%20non-gaussian%20variability." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=Automatic+sorting+of+multiple+unit+neuronal+signals+in+the+presence+of+anisotropic+and+non-gaussian+variability.+Fee+1996" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref11"><span class="order">11. </span><a name="pone.0019884-Ankerst1" id="pone.0019884-Ankerst1" class="link-target"></a>Ankerst M, Breunig MM, Kriegel HP, Sander J (1999) OPTICS: Ordering points to identify the clustering structure. SIGMOD Rec 28: 49–60. <ul class="reflinks"><li><a href="#" data-author="Ankerst" data-cit="AnkerstMBreunigMMKriegelHPSanderJ1999OPTICS%3A%20Ordering%20points%20to%20identify%20the%20clustering%20structure.SIGMOD%20Rec284960" data-title="OPTICS%3A%20Ordering%20points%20to%20identify%20the%20clustering%20structure." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=OPTICS%3A+Ordering+points+to+identify+the+clustering+structure.+Ankerst+1999" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref12"><span class="order">12. </span><a name="pone.0019884-Harris1" id="pone.0019884-Harris1" class="link-target"></a>Harris KD, Hirase H, Leinekugel X, Henze DA, Buzsáki G (2001) Temporal interaction between single spikes and complex spike bursts in hippocampal pyramidal cells. Neuron 32: 141–9. <ul class="reflinks"><li><a href="#" data-author="Harris" data-cit="HarrisKDHiraseHLeinekugelXHenzeDABuzs%C3%A1kiG2001Temporal%20interaction%20between%20single%20spikes%20and%20complex%20spike%20bursts%20in%20hippocampal%20pyramidal%20cells.Neuron321419" data-title="Temporal%20interaction%20between%20single%20spikes%20and%20complex%20spike%20bursts%20in%20hippocampal%20pyramidal%20cells." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=Temporal+interaction+between+single+spikes+and+complex+spike+bursts+in+hippocampal+pyramidal+cells.+Harris+2001" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref13"><span class="order">13. </span><a name="pone.0019884-Ratliff1" id="pone.0019884-Ratliff1" class="link-target"></a>Ratliff C, Borghuis B, Kao Y, Sterling P, Balasubramanian V (2010) Retina is structured to process an excess of darkness in natural scenes. Proceedings of the National Academy of Sciences 107: 17368. <ul class="reflinks"><li><a href="#" data-author="Ratliff" data-cit="RatliffCBorghuisBKaoYSterlingPBalasubramanianV2010Retina%20is%20structured%20to%20process%20an%20excess%20of%20darkness%20in%20natural%20scenes.Proceedings%20of%20the%20National%20Academy%20of%20Sciences10717368" data-title="Retina%20is%20structured%20to%20process%20an%20excess%20of%20darkness%20in%20natural%20scenes." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=Retina+is+structured+to+process+an+excess+of+darkness+in+natural+scenes.+Ratliff+2010" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref14"><span class="order">14. </span><a name="pone.0019884-Chichilnisky1" id="pone.0019884-Chichilnisky1" class="link-target"></a>Chichilnisky E, Kalmar R (2002) Functional asymmetries in ON and OFF ganglion cells of primate retina. Journal of Neuroscience 22: 2737. <ul class="reflinks"><li><a href="#" data-author="Chichilnisky" data-cit="ChichilniskyEKalmarR2002Functional%20asymmetries%20in%20ON%20and%20OFF%20ganglion%20cells%20of%20primate%20retina.Journal%20of%20Neuroscience222737" data-title="Functional%20asymmetries%20in%20ON%20and%20OFF%20ganglion%20cells%20of%20primate%20retina." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=Functional+asymmetries+in+ON+and+OFF+ganglion+cells+of+primate+retina.+Chichilnisky+2002" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref15"><span class="order">15. </span><a name="pone.0019884-Peichl1" id="pone.0019884-Peichl1" class="link-target"></a>Peichl L, Buhl E, Boycott B (1987) Alpha ganglion cells in the rabbit retina. The Journal of Comparative Neurology 263: 25–41. <ul class="reflinks"><li><a href="#" data-author="Peichl" data-cit="PeichlLBuhlEBoycottB1987Alpha%20ganglion%20cells%20in%20the%20rabbit%20retina.The%20Journal%20of%20Comparative%20Neurology2632541" data-title="Alpha%20ganglion%20cells%20in%20the%20rabbit%20retina." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=Alpha+ganglion+cells+in+the+rabbit+retina.+Peichl+1987" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref16"><span class="order">16. </span><a name="pone.0019884-Peichl2" id="pone.0019884-Peichl2" class="link-target"></a>Peichl L (1989) Alpha and delta ganglion cells in the rat retina. The Journal of Comparative Neurology 286: 120–139. <ul class="reflinks"><li><a href="#" data-author="Peichl" data-cit="PeichlL1989Alpha%20and%20delta%20ganglion%20cells%20in%20the%20rat%20retina.The%20Journal%20of%20Comparative%20Neurology286120139" data-title="Alpha%20and%20delta%20ganglion%20cells%20in%20the%20rat%20retina." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=Alpha+and+delta+ganglion+cells+in+the+rat+retina.+Peichl+1989" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref17"><span class="order">17. </span><a name="pone.0019884-Dacey1" id="pone.0019884-Dacey1" class="link-target"></a>Dacey D, Petersen M (1992) Dendritic field size and morphology of midget and parasol ganglion cells of the human retina. Proceedings of the National Academy of Sciences of the United States of America 89: 9666. <ul class="reflinks"><li><a href="#" data-author="Dacey" data-cit="DaceyDPetersenM1992Dendritic%20field%20size%20and%20morphology%20of%20midget%20and%20parasol%20ganglion%20cells%20of%20the%20human%20retina.Proceedings%20of%20the%20National%20Academy%20of%20Sciences%20of%20the%20United%20States%20of%20America899666" data-title="Dendritic%20field%20size%20and%20morphology%20of%20midget%20and%20parasol%20ganglion%20cells%20of%20the%20human%20retina." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=Dendritic+field+size+and+morphology+of+midget+and+parasol+ganglion+cells+of+the+human+retina.+Dacey+1992" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref18"><span class="order">18. </span><a name="pone.0019884-Tauchi1" id="pone.0019884-Tauchi1" class="link-target"></a>Tauchi M, Morigiwa K, Fukuda Y (1992) Morphological comparisons between outer and inner ramifying alpha cells of the albino rat retina. Experimental brain research 88: 67–77. <ul class="reflinks"><li><a href="#" data-author="Tauchi" data-cit="TauchiMMorigiwaKFukudaY1992Morphological%20comparisons%20between%20outer%20and%20inner%20ramifying%20alpha%20cells%20of%20the%20albino%20rat%20retina.Experimental%20brain%20research886777" data-title="Morphological%20comparisons%20between%20outer%20and%20inner%20ramifying%20alpha%20cells%20of%20the%20albino%20rat%20retina." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=Morphological+comparisons+between+outer+and+inner+ramifying+alpha+cells+of+the+albino+rat+retina.+Tauchi+1992" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref19"><span class="order">19. </span><a name="pone.0019884-DoNascimento1" id="pone.0019884-DoNascimento1" class="link-target"></a>Do-Nascimento JLM, Do-Nascimento RSV, Damasceno BA, Silveira LCL (1991) The neurons of the retinal ganglion cell layer of the guinea pig: Quantitative analysis of their distribution and size. Brazilian J Med Biol Res 24: 199–214. <ul class="reflinks"><li><a href="#" data-author="Do-Nascimento" data-cit="Do-NascimentoJLMDo-NascimentoRSVDamascenoBASilveiraLCL1991The%20neurons%20of%20the%20retinal%20ganglion%20cell%20layer%20of%20the%20guinea%20pig%3A%20Quantitative%20analysis%20of%20their%20distribution%20and%20size.Brazilian%20J%20Med%20Biol%20Res24199214" data-title="The%20neurons%20of%20the%20retinal%20ganglion%20cell%20layer%20of%20the%20guinea%20pig%3A%20Quantitative%20analysis%20of%20their%20distribution%20and%20size." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=The+neurons+of+the+retinal+ganglion+cell+layer+of+the+guinea+pig%3A+Quantitative+analysis+of+their+distribution+and+size.+Do-Nascimento+1991" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref20"><span class="order">20. </span><a name="pone.0019884-Quiroga1" id="pone.0019884-Quiroga1" class="link-target"></a>Quiroga RQ (2007) Spike sorting. Scholarpedia 2: 3583. <ul class="reflinks"><li><a href="#" data-author="Quiroga" data-cit="QuirogaRQ2007Spike%20sorting.Scholarpedia23583" data-title="Spike%20sorting." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=Spike+sorting.+Quiroga+2007" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref21"><span class="order">21. </span><a name="pone.0019884-Lewicki1" id="pone.0019884-Lewicki1" class="link-target"></a>Lewicki MS (1994) Bayesian modeling and classification of neural signals. Neural computation 6: 1005–1030. <ul class="reflinks"><li><a href="#" data-author="Lewicki" data-cit="LewickiMS1994Bayesian%20modeling%20and%20classification%20of%20neural%20signals.Neural%20computation610051030" data-title="Bayesian%20modeling%20and%20classification%20of%20neural%20signals." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=Bayesian+modeling+and+classification+of+neural+signals.+Lewicki+1994" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref22"><span class="order">22. </span><a name="pone.0019884-Atiya1" id="pone.0019884-Atiya1" class="link-target"></a>Atiya A (1992) Recognition of multiunit neural signals. IEEE Transactions on Biomedical Engineering 39: 723–729. <ul class="reflinks"><li><a href="#" data-author="Atiya" data-cit="AtiyaA1992Recognition%20of%20multiunit%20neural%20signals.IEEE%20Transactions%20on%20Biomedical%20Engineering39723729" data-title="Recognition%20of%20multiunit%20neural%20signals." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=Recognition+of+multiunit+neural+signals.+Atiya+1992" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref23"><span class="order">23. </span><a name="pone.0019884-Sahani1" id="pone.0019884-Sahani1" class="link-target"></a>Sahani M (1999) Latent variable models for neural data analysis. Ph.D. thesis, California Institute of Technology, Pasadena CA. <ul class="find-nolinks"></ul></li><li id="ref24"><span class="order">24. </span><a name="pone.0019884-Shoham1" id="pone.0019884-Shoham1" class="link-target"></a>Shoham S, Fellows MR, Normann RA (2003) Robust, automatic spike sorting using mixtures of multivariate t-distributions. J Neurosci Methods 127: 111–22. <ul class="reflinks"><li><a href="#" data-author="Shoham" data-cit="ShohamSFellowsMRNormannRA2003Robust%2C%20automatic%20spike%20sorting%20using%20mixtures%20of%20multivariate%20t-distributions.J%20Neurosci%20Methods12711122" data-title="Robust%2C%20automatic%20spike%20sorting%20using%20mixtures%20of%20multivariate%20t-distributions." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=Robust%2C+automatic+spike+sorting+using+mixtures+of+multivariate+t-distributions.+Shoham+2003" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref25"><span class="order">25. </span><a name="pone.0019884-Schneidman1" id="pone.0019884-Schneidman1" class="link-target"></a>Schneidman E, Berry MJ, Segev R, Bialek W (2006) Weak pairwise correlations imply strongly correlated network states in a neural population. Nature 440: 1007–12. <ul class="reflinks"><li><a href="#" data-author="Schneidman" data-cit="SchneidmanEBerryMJSegevRBialekW2006Weak%20pairwise%20correlations%20imply%20strongly%20correlated%20network%20states%20in%20a%20neural%20population.Nature440100712" data-title="Weak%20pairwise%20correlations%20imply%20strongly%20correlated%20network%20states%20in%20a%20neural%20population." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=Weak+pairwise+correlations+imply+strongly+correlated+network+states+in+a+neural+population.+Schneidman+2006" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref26"><span class="order">26. </span><a name="pone.0019884-Ventura1" id="pone.0019884-Ventura1" class="link-target"></a>Ventura V (2009) Traditional waveform based spike sorting yields biased rate code estimates. Proc Natl Acad Sci USA 106: 6921–6. <ul class="reflinks"><li><a href="#" data-author="Ventura" data-cit="VenturaV2009Traditional%20waveform%20based%20spike%20sorting%20yields%20biased%20rate%20code%20estimates.Proc%20Natl%20Acad%20Sci%20USA10669216" data-title="Traditional%20waveform%20based%20spike%20sorting%20yields%20biased%20rate%20code%20estimates." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=Traditional+waveform+based+spike+sorting+yields+biased+rate+code+estimates.+Ventura+2009" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref27"><span class="order">27. </span><a name="pone.0019884-Lewicki2" id="pone.0019884-Lewicki2" class="link-target"></a>Lewicki MS (1998) A review of methods for spike sorting: The detection and classification of neural action potentials. Network (Bristol, England) 9: R53–78. <ul class="reflinks"><li><a href="#" data-author="Lewicki" data-cit="LewickiMS1998A%20review%20of%20methods%20for%20spike%20sorting%3A%20The%20detection%20and%20classification%20of%20neural%20action%20potentials.Network%20%28Bristol%2C%20England%299R5378" data-title="A%20review%20of%20methods%20for%20spike%20sorting%3A%20The%20detection%20and%20classification%20of%20neural%20action%20potentials." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=A+review+of+methods+for+spike+sorting%3A+The+detection+and+classification+of+neural+action+potentials.+Lewicki+1998" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref28"><span class="order">28. </span><a name="pone.0019884-Pillow1" id="pone.0019884-Pillow1" class="link-target"></a>Pillow JW, Shlens J, Paninski L, Sher A, Litke AM, et al. (2008) Spatio-temporal correlations and visual signalling in a complete neuronal population. Nature 454: 995–999. <ul class="reflinks"><li><a href="#" data-author="Pillow" data-cit="PillowJWShlensJPaninskiLSherALitkeAM2008Spatio-temporal%20correlations%20and%20visual%20signalling%20in%20a%20complete%20neuronal%20population.Nature454995999" data-title="Spatio-temporal%20correlations%20and%20visual%20signalling%20in%20a%20complete%20neuronal%20population." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=Spatio-temporal+correlations+and+visual+signalling+in+a+complete+neuronal+population.+Pillow+2008" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li><li id="ref29"><span class="order">29. </span><a name="pone.0019884-Tkaficik1" id="pone.0019884-Tkaficik1" class="link-target"></a>Tkaficik G, Prentice J, Balasubramanian V, Schneidman E (2010) Optimal population coding by noisy spiking neurons. Proceedings of the National Academy of Sciences 107: 14419. <ul class="reflinks"><li><a href="#" data-author="Tkaficik" data-cit="TkaficikGPrenticeJBalasubramanianVSchneidmanE2010Optimal%20population%20coding%20by%20noisy%20spiking%20neurons.Proceedings%20of%20the%20National%20Academy%20of%20Sciences10714419" data-title="Optimal%20population%20coding%20by%20noisy%20spiking%20neurons." target="_new" title="Go to article in CrossRef"> View Article </a></li><li><a href="http://scholar.google.com/scholar?q=Optimal+population+coding+by+noisy+spiking+neurons.+Tkaficik+2010" target="_new" title="Go to article in Google Scholar"> Google Scholar </a></li></ul></li></ol></div> <div class="ref-tooltip"> <div class="ref_tooltip-content"> </div> </div> </div> </div> </div> </section> <aside class="article-aside"> <!--[if IE 9]> <style> .dload-xml {margin-top: 38px} </style> <![endif]--> <div class="dload-menu"> <div class="dload-pdf"> <a href="/plosone/article/file?id=10.1371/journal.pone.0019884&type=printable" id="downloadPdf" target="_blank">Download PDF</a> </div> <div data-js-tooltip-hover="trigger" class="dload-hover"> <ul class="dload-xml" data-js-tooltip-hover="target"> <li><a href="/plosone/article/citation?id=10.1371/journal.pone.0019884" id="downloadCitation">Citation</a></li> <li><a href="/plosone/article/file?id=10.1371/journal.pone.0019884&type=manuscript" id="downloadXml">XML</a> </li> </ul> </div> </div> <div class="aside-container"> <div class="print-article" id="printArticle" data-js-tooltip-hover="trigger"> <a href="#" onclick="window.print(); return false;" class="preventDefault" id="printBrowser">Print</a> </div> <div class="share-article" id="shareArticle" data-js-tooltip-hover="trigger"> Share <ul data-js-tooltip-hover="target" class="share-options" id="share-options"> <li><a href="https://www.reddit.com/submit?url=https%3A%2F%2Fdx.plos.org%2F10.1371%2Fjournal.pone.0019884" id="shareReddit" target="_blank" title="Submit to Reddit"><img src="/resource/img/icon.reddit.16.png" width="16" height="16" alt="Reddit">Reddit</a></li> <li><a href="https://www.facebook.com/share.php?u=https%3A%2F%2Fdx.plos.org%2F10.1371%2Fjournal.pone.0019884&t=Fast, Scalable, Bayesian Spike Identification for Multi-Electrode Arrays" id="shareFacebook" target="_blank" title="Share on Facebook"><img src="/resource/img/icon.fb.16.png" width="16" height="16" alt="Facebook">Facebook</a></li> <li><a href="https://www.linkedin.com/shareArticle?url=https%3A%2F%2Fdx.plos.org%2F10.1371%2Fjournal.pone.0019884&title=Fast, Scalable, Bayesian Spike Identification for Multi-Electrode Arrays&summary=Checkout this article I found at PLOS" id="shareLinkedIn" target="_blank" title="Add to LinkedIn"><img src="/resource/img/icon.linkedin.16.png" width="16" height="16" alt="LinkedIn">LinkedIn</a></li> <li><a href="https://www.mendeley.com/import/?url=https%3A%2F%2Fdx.plos.org%2F10.1371%2Fjournal.pone.0019884" id="shareMendeley" target="_blank" title="Add to Mendeley"><img src="/resource/img/icon.mendeley.16.png" width="16" height="16" alt="Mendeley">Mendeley</a></li> <li><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fdx.plos.org%2F10.1371%2Fjournal.pone.0019884&text=%23PLOSONE%3A%20Fast, Scalable, Bayesian Spike Identification for Multi-Electrode Arrays" target="_blank" title="share on Twitter" id="twitter-share-link"><img src="/resource/img/icon.twtr.16.png" width="16" height="16" alt="Twitter">Twitter</a></li> <li><a href="mailto:?subject=Fast, Scalable, Bayesian Spike Identification for Multi-Electrode Arrays&body=I%20thought%20you%20would%20find%20this%20article%20interesting.%20From%20PLOS ONE:%20https%3A%2F%2Fdx.plos.org%2F10.1371%2Fjournal.pone.0019884" id="shareEmail" rel="noreferrer" aria-label="Email"><img src="/resource/img/icon.email.16.png" width="16" height="16" alt="Email">Email</a></li> <script src="/resource/js/components/tweet140.js" type="text/javascript"></script> </ul> </div> </div> <!-- Crossmark 2.0 widget --> <script src="https://crossmark-cdn.crossref.org/widget/v2.0/widget.js"></script> <a aria-label="Check for updates via CrossMark" data-target="crossmark"> <img alt="Check for updates via CrossMark" width="150" src="https://crossmark-cdn.crossref.org/widget/v2.0/logos/CROSSMARK_BW_horizontal.svg"> </a> <!-- End Crossmark 2.0 widget --> <div class="aside-container collections-aside-container"><!-- React Magic --></div> <div class="skyscraper-container"> <div class="title">Advertisement</div> <!-- DoubleClick Ad Zone --> <div class='advertisement' id='div-gpt-ad-1458247671871-1' style='width:160px; height:600px;'> <script type='text/javascript'> googletag.cmd.push(function() { googletag.display('div-gpt-ad-1458247671871-1'); }); </script> </div> </div> <div class="subject-areas-container"> <h3>Subject Areas <div id="subjInfo">?</div> <div id="subjInfoText"> <p>For more information about PLOS Subject Areas, click <a href="https://github.com/PLOS/plos-thesaurus/blob/master/README.md" target="_blank" title="Link opens in new window">here</a>.</p> <span class="inline-intro">We want your feedback.</span> Do these Subject Areas make sense for this article? Click the target next to the incorrect Subject Area and let us know. Thanks for your help! </div> </h3> <ul id="subjectList"> <li> <a class="taxo-term" title="Search for articles about Action potentials" href="/plosone/search?filterSubjects=Action+potentials&filterJournals=PLoSONE&q=">Action potentials</a> <span class="taxo-flag"> </span> <div class="taxo-tooltip" data-categoryname="Action potentials"><p class="taxo-explain">Is the Subject Area <strong>"Action potentials"</strong> applicable to this article? <button id="noFlag" data-action="remove">Yes</button> <button id="flagIt" value="flagno" data-action="add">No</button></p> <p class="taxo-confirm">Thanks for your feedback.</p> </div> </li> <li> <a class="taxo-term" title="Search for articles about Electrode potentials" href="/plosone/search?filterSubjects=Electrode+potentials&filterJournals=PLoSONE&q=">Electrode potentials</a> <span class="taxo-flag"> </span> <div class="taxo-tooltip" data-categoryname="Electrode potentials"><p class="taxo-explain">Is the Subject Area <strong>"Electrode potentials"</strong> applicable to this article? <button id="noFlag" data-action="remove">Yes</button> <button id="flagIt" value="flagno" data-action="add">No</button></p> <p class="taxo-confirm">Thanks for your feedback.</p> </div> </li> <li> <a class="taxo-term" title="Search for articles about Electrodes" href="/plosone/search?filterSubjects=Electrodes&filterJournals=PLoSONE&q=">Electrodes</a> <span class="taxo-flag"> </span> <div class="taxo-tooltip" data-categoryname="Electrodes"><p class="taxo-explain">Is the Subject Area <strong>"Electrodes"</strong> applicable to this article? <button id="noFlag" data-action="remove">Yes</button> <button id="flagIt" value="flagno" data-action="add">No</button></p> <p class="taxo-confirm">Thanks for your feedback.</p> </div> </li> <li> <a class="taxo-term" title="Search for articles about Gaussian noise" href="/plosone/search?filterSubjects=Gaussian+noise&filterJournals=PLoSONE&q=">Gaussian noise</a> <span class="taxo-flag"> </span> <div class="taxo-tooltip" data-categoryname="Gaussian noise"><p class="taxo-explain">Is the Subject Area <strong>"Gaussian noise"</strong> applicable to this article? <button id="noFlag" data-action="remove">Yes</button> <button id="flagIt" value="flagno" data-action="add">No</button></p> <p class="taxo-confirm">Thanks for your feedback.</p> </div> </li> <li> <a class="taxo-term" title="Search for articles about Covariance" href="/plosone/search?filterSubjects=Covariance&filterJournals=PLoSONE&q=">Covariance</a> <span class="taxo-flag"> </span> <div class="taxo-tooltip" data-categoryname="Covariance"><p class="taxo-explain">Is the Subject Area <strong>"Covariance"</strong> applicable to this article? <button id="noFlag" data-action="remove">Yes</button> <button id="flagIt" value="flagno" data-action="add">No</button></p> <p class="taxo-confirm">Thanks for your feedback.</p> </div> </li> <li> <a class="taxo-term" title="Search for articles about Retinal ganglion cells" href="/plosone/search?filterSubjects=Retinal+ganglion+cells&filterJournals=PLoSONE&q=">Retinal ganglion cells</a> <span class="taxo-flag"> </span> <div class="taxo-tooltip" data-categoryname="Retinal ganglion cells"><p class="taxo-explain">Is the Subject Area <strong>"Retinal ganglion cells"</strong> applicable to this article? <button id="noFlag" data-action="remove">Yes</button> <button id="flagIt" value="flagno" data-action="add">No</button></p> <p class="taxo-confirm">Thanks for your feedback.</p> </div> </li> <li> <a class="taxo-term" title="Search for articles about Algorithms" href="/plosone/search?filterSubjects=Algorithms&filterJournals=PLoSONE&q=">Algorithms</a> <span class="taxo-flag"> </span> <div class="taxo-tooltip" data-categoryname="Algorithms"><p class="taxo-explain">Is the Subject Area <strong>"Algorithms"</strong> applicable to this article? <button id="noFlag" data-action="remove">Yes</button> <button id="flagIt" value="flagno" data-action="add">No</button></p> <p class="taxo-confirm">Thanks for your feedback.</p> </div> </li> <li> <a class="taxo-term" title="Search for articles about Statistical distributions" href="/plosone/search?filterSubjects=Statistical+distributions&filterJournals=PLoSONE&q=">Statistical distributions</a> <span class="taxo-flag"> </span> <div class="taxo-tooltip" data-categoryname="Statistical distributions"><p class="taxo-explain">Is the Subject Area <strong>"Statistical distributions"</strong> applicable to this article? <button id="noFlag" data-action="remove">Yes</button> <button id="flagIt" value="flagno" data-action="add">No</button></p> <p class="taxo-confirm">Thanks for your feedback.</p> </div> </li> </ul> </div> <div id="subjectErrors"></div> </aside> </div> </main> <footer id="pageftr"> <div class="row"> <div class="block x-small"> <ul class="nav nav-secondary"> <li class="ftr-header"><a href="https://plos.org/publications/journals/">Publications</a></li> <li><a href="/plosbiology/" id="ftr-bio">PLOS Biology</a></li> <li><a href="/climate/" id="ftr-climate">PLOS Climate</a></li> <li><a href="/complexsystems/" id="ftr-complex-systems">PLOS Complex Systems</a></li> <li><a href="/ploscompbiol/" id="ftr-compbio">PLOS Computational Biology</a></li> <li><a href="/digitalhealth/" id="ftr-digitalhealth">PLOS Digital Health</a></li> <li><a href="/plosgenetics/" id="ftr-gen">PLOS Genetics</a></li> <li><a href="/globalpublichealth/" id="ftr-globalpublichealth">PLOS Global Public Health</a></li> </ul> </div> <div class="block x-small"> <ul class="nav nav-secondary"> <li class="ftr-header"> </li> <li><a href="/plosmedicine/" id="ftr-med">PLOS Medicine</a></li> <li><a href="/mentalhealth/" id="ftr-mental-health">PLOS Mental Health</a></li> <li><a href="/plosntds/" id="ftr-ntds">PLOS Neglected Tropical Diseases</a></li> <li><a href="/plosone/" id="ftr-one">PLOS ONE</a></li> <li><a href="/plospathogens/" id="ftr-path">PLOS Pathogens</a></li> <li><a href="/sustainabilitytransformation/" id="ftr-sustainabilitytransformation">PLOS Sustainability and Transformation</a></li> <li><a href="/water/" id="ftr-water">PLOS Water</a></li> </ul> </div> <div class="block xx-small"> <ul class="nav nav-tertiary"> <li> <a href="https://plos.org" id="ftr-home">Home</a> </li> <li> <a href="https://blogs.plos.org" id="ftr-blog">Blogs</a> </li> <li> <a href="https://collections.plos.org/" id="ftr-collections">Collections</a> </li> <li> <a href="mailto:webmaster@plos.org" id="ftr-feedback">Give feedback</a> </li> <li> <a href="/plosone/lockss-manifest" id="ftr-lockss">LOCKSS</a> </li> </ul> </div> <div class="block xx-small"> <ul class="nav nav-primary"> <li><a href="https://plos.org/privacy-policy" id="ftr-privacy">Privacy Policy</a></li> <li><a href="https://plos.org/terms-of-use" id="ftr-terms">Terms of Use</a></li> <li><a href="https://plos.org/advertise/" id="ftr-advertise">Advertise</a></li> <li><a href="https://plos.org/media-inquiries" id="ftr-media">Media Inquiries</a></li> <li><a href="https://plos.org/contact" id="ftr-contact">Contact</a></li> </ul> </div> </div> <div class="row"> <p> <img src="/resource/img/logo-plos-footer.png" alt="PLOS" class="logo-footer"/> <span class="footer-non-profit-statement">PLOS is a nonprofit 501(c)(3) corporation, #C2354500, based in San Francisco, California, US</span> </p> <div class="block"> </div> </div> <script src="/resource/js/global.js" type="text/javascript"></script> </footer> <script type="text/javascript"> var ArticleData = { doi: '10.1371/journal.pone.0019884', title: '<article-title xmlns:mml=\"http://www.w3.org/1998/Math/MathML\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">Fast, Scalable, Bayesian Spike Identification for Multi-Electrode Arrays<\/article-title>', date: 'Jul 20, 2011' }; </script> <script src="/resource/js/components/show_onscroll.js" type="text/javascript"></script> <script src="/resource/js/components/pagination.js" type="text/javascript"></script> <script src="/resource/js/vendor/spin.js" type="text/javascript"></script> <script src="/resource/js/pages/article.js" type="text/javascript"></script> <script src="/resource/js/pages/article_references.js" type="text/javascript"></script> <script src="/resource/js/pages/article_sidebar.js" type="text/javascript"></script> <script src="/resource/js/vendor/foundation/foundation.dropdown.js" type="text/javascript"></script> <script src="/resource/js/components/table_open.js" type="text/javascript"></script> <script src="/resource/js/components/figshare.js" type="text/javascript"></script> <script src="/resource/js/vendor/jquery.panzoom.min.js" type="text/javascript"></script> <script src="/resource/js/vendor/jquery.mousewheel.js" type="text/javascript"></script> <script src="/resource/js/components/lightbox.js" type="text/javascript"></script> <script src="/resource/js/pages/article_body.js" type="text/javascript"></script> <!-- This file should be loaded before the renderJs, to avoid conflicts with the FigShare, that implements the MathJax also. --> <!-- mathjax configuration options --> <!-- more can be found at http://docs.mathjax.org/en/latest/ --> <script type="text/x-mathjax-config"> MathJax.Hub.Config({ "HTML-CSS": { scale: 100, availableFonts: ["STIX","TeX"], preferredFont: "STIX", webFont: "STIX-Web", linebreaks: { automatic: false } }, jax: ["input/MathML", "output/HTML-CSS"] }); </script> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=MML_HTMLorMML"></script> <div class="reveal-modal-bg"></div> </body> </html>