From 98a28d5e4219d05c21b7d33bf4e2c9b1652b7333 Mon Sep 17 00:00:00 2001 From: Samuel Garcia Date: Tue, 25 Aug 2020 17:19:15 +0200 Subject: [PATCH 01/13] start collision widget for plotting results --- spikewidgets/__init__.py | 1 + .../widgets/collisioncompwidget/__init__.py | 1 + .../collisioncompwidget.py | 112 ++++++++++++++++++ 3 files changed, 114 insertions(+) create mode 100644 spikewidgets/widgets/collisioncompwidget/__init__.py create mode 100644 spikewidgets/widgets/collisioncompwidget/collisioncompwidget.py diff --git a/spikewidgets/__init__.py b/spikewidgets/__init__.py index 90e8d11..6aca5f5 100644 --- a/spikewidgets/__init__.py +++ b/spikewidgets/__init__.py @@ -12,5 +12,6 @@ from .widgets.spectrumwidget import * from .widgets.agreementmatrixwidget import * from .widgets.mapswidget import * +from .widgets.collisioncompwidget import * from .version import version as __version__ diff --git a/spikewidgets/widgets/collisioncompwidget/__init__.py b/spikewidgets/widgets/collisioncompwidget/__init__.py new file mode 100644 index 0000000..4ff61cf --- /dev/null +++ b/spikewidgets/widgets/collisioncompwidget/__init__.py @@ -0,0 +1 @@ +from .collisioncompwidget import plot_collision_gt_comparison diff --git a/spikewidgets/widgets/collisioncompwidget/collisioncompwidget.py b/spikewidgets/widgets/collisioncompwidget/collisioncompwidget.py new file mode 100644 index 0000000..404f459 --- /dev/null +++ b/spikewidgets/widgets/collisioncompwidget/collisioncompwidget.py @@ -0,0 +1,112 @@ +import numpy as np +import matplotlib +from matplotlib import pyplot as plt +from spikewidgets.widgets.basewidget import BaseWidget, BaseMultiWidget + +import matplotlib.gridspec as gridspec + +def plot_collision_gt_comparison(comp, unit_ids=None, nbins=10, figure=None, ax=None): + """ + Plots multi sorting comparison graph. + + Parameters + ---------- + comp: CollisionGTComparison + The collision ground truth comparison object + unit_ids: list + List of considered units + nbins: int + Number of bins + figure: matplotlib figure + The figure to be used. If not given a figure is created + ax: matplotlib axis + The axis to be used. If not given an axis is created + + Returns + ------- + W: MultiCompGraphWidget + The output widget + """ + try: + import networkx as nx + except ImportError as e: + raise ImportError('Install networkx to use the multi comparison widget.') + W = CollisionGTComparisonWidget( + comp=comp, + unit_ids=unit_ids, + nbins=nbins, + figure=figure, + ax=ax + ) + W.plot() + return W + + +class CollisionGTComparisonWidget(BaseWidget): + def __init__(self, comp, unit_ids=None, nbins=10, figure=None, ax=None): + BaseWidget.__init__(self, figure, ax) + if unit_ids is None: + # take all units + unit_ids = comp.sorting1.get_unit_ids() + + self.comp = comp + self.unit_ids = unit_ids + self.nbins = nbins + + def plot(self): + self._do_plot() + + def _do_plot(self): + fig = self.figure + + for ax in fig.axes: + ax.remove() + + n = len(self.unit_ids) + gs = gridspec.GridSpec(ncols=n, nrows=n, figure=fig) + + axs = np.empty((n,n), dtype=object) + ax = None + for r in range(n): + for c in range(n): + ax = fig.add_subplot(gs[r, c], sharex=ax, sharey=ax) + if c > 0: + plt.setp(ax.get_yticklabels(), visible=False) + if r < n-1: + plt.setp(ax.get_xticklabels(), visible=False) + axs[r, c] = ax + + fs = self.comp.sorting1.get_sampling_frequency() + + for r in range(n): + for c in range(r+1, n): + + u1 = self.unit_ids[r] + u2 = self.unit_ids[c] + + bins, tp_count1, fn_count1, tp_count2, fn_count2 = self.comp.get_label_count_per_collision_bins(u1, u2, nbins=self.nbins) + + width = (bins[1] - bins[0]) / fs * 1000. + lags = bins[:-1] / fs * 1000 + + ax = axs[r, c] + ax.bar(lags, tp_count1, width=width, color='g') + ax.bar(lags, fn_count1, width=width, bottom=tp_count1, color='r') + + ax = axs[c, r] + ax.bar(lags, tp_count2, width=width, color='g') + ax.bar(lags, fn_count2, width=width, bottom=tp_count2, color='r') + + for r in range(n): + ax = axs[r, 0] + u1 = self.unit_ids[r] + ax.set_ylabel(f'gt id{u1}') + + for c in range(n): + ax = axs[0, c] + u2 = self.unit_ids[c] + ax.set_title(f'collision with \ngt id{u2}') + + ax = axs[0, 0] + ax.set_xlabel('collision lag [ms]') + From f3ded768e87c8720bc123697938f58a52680feaa Mon Sep 17 00:00:00 2001 From: Samuel Garcia Date: Wed, 9 Sep 2020 22:09:47 +0200 Subject: [PATCH 02/13] POC: plot collision accuracy sorted by similarity --- .../widgets/collisioncompwidget/__init__.py | 2 +- .../collisioncompwidget.py | 109 ++++++++++++++++-- 2 files changed, 100 insertions(+), 11 deletions(-) diff --git a/spikewidgets/widgets/collisioncompwidget/__init__.py b/spikewidgets/widgets/collisioncompwidget/__init__.py index 4ff61cf..9e131c4 100644 --- a/spikewidgets/widgets/collisioncompwidget/__init__.py +++ b/spikewidgets/widgets/collisioncompwidget/__init__.py @@ -1 +1 @@ -from .collisioncompwidget import plot_collision_gt_comparison +from .collisioncompwidget import plot_comparison_collision_pair_by_pair, plot_comparison_collision_by_similarity diff --git a/spikewidgets/widgets/collisioncompwidget/collisioncompwidget.py b/spikewidgets/widgets/collisioncompwidget/collisioncompwidget.py index 404f459..32c710c 100644 --- a/spikewidgets/widgets/collisioncompwidget/collisioncompwidget.py +++ b/spikewidgets/widgets/collisioncompwidget/collisioncompwidget.py @@ -1,11 +1,15 @@ import numpy as np -import matplotlib +import sklearn + from matplotlib import pyplot as plt +import matplotlib.gridspec as gridspec + + from spikewidgets.widgets.basewidget import BaseWidget, BaseMultiWidget -import matplotlib.gridspec as gridspec -def plot_collision_gt_comparison(comp, unit_ids=None, nbins=10, figure=None, ax=None): + +def plot_comparison_collision_pair_by_pair(comp, unit_ids=None, nbins=10, figure=None, ax=None): """ Plots multi sorting comparison graph. @@ -27,12 +31,22 @@ def plot_collision_gt_comparison(comp, unit_ids=None, nbins=10, figure=None, ax= W: MultiCompGraphWidget The output widget """ - try: - import networkx as nx - except ImportError as e: - raise ImportError('Install networkx to use the multi comparison widget.') - W = CollisionGTComparisonWidget( + W = ComparisonCollisionPairByPairWidget( + comp=comp, + unit_ids=unit_ids, + nbins=nbins, + figure=figure, + ax=ax + ) + W.plot() + return W + + +def plot_comparison_collision_by_similarity(comp, templates, unit_ids=None, nbins=10, figure=None, ax=None): + + W = ComparisonCollisionBySimilarityWidget( comp=comp, + templates=templates, unit_ids=unit_ids, nbins=nbins, figure=figure, @@ -42,7 +56,8 @@ def plot_collision_gt_comparison(comp, unit_ids=None, nbins=10, figure=None, ax= return W -class CollisionGTComparisonWidget(BaseWidget): + +class ComparisonCollisionPairByPairWidget(BaseWidget): def __init__(self, comp, unit_ids=None, nbins=10, figure=None, ax=None): BaseWidget.__init__(self, figure, ax) if unit_ids is None: @@ -107,6 +122,80 @@ def _do_plot(self): u2 = self.unit_ids[c] ax.set_title(f'collision with \ngt id{u2}') - ax = axs[0, 0] + ax = axs[-1, 0] ax.set_xlabel('collision lag [ms]') + + +class ComparisonCollisionBySimilarityWidget(BaseWidget): + def __init__(self, comp, templates, unit_ids=None, nbins=10, figure=None, ax=None): + BaseWidget.__init__(self, figure, ax) + if unit_ids is None: + # take all units + unit_ids = comp.sorting1.get_unit_ids() + + self.comp = comp + self.templates = templates + self.unit_ids = unit_ids + self.nbins = nbins + + def plot(self): + self._do_plot() + + def _do_plot(self): + #~ fig = self.figure + ax = self.ax + #~ for ax in fig.axes: + #~ ax.remove() + + # compute similarity + # take index of temmplate (respect unit_ids order) + all_unit_ids = list(self.comp.sorting1.get_unit_ids()) + template_inds = [all_unit_ids.index(u) for u in self.unit_ids] + #~ print('template_inds', template_inds) + templates = self.templates[template_inds, :, :].copy() + flat_templates = templates.reshape(templates.shape[0], -1) + similarity_matrix = sklearn.metrics.pairwise.cosine_distances(flat_templates) + #~ print(similarity_matrix) + + n = len(self.unit_ids) + + + fs = self.comp.sorting1.get_sampling_frequency() + accuracies = [] + similarities = [] + for r in range(n): + for c in range(r+1, n): + + u1 = self.unit_ids[r] + u2 = self.unit_ids[c] + + bins, tp_count1, fn_count1, tp_count2, fn_count2 = self.comp.get_label_count_per_collision_bins(u1, u2, nbins=self.nbins) + + width = (bins[1] - bins[0]) / fs * 1000. + lags = bins[:-1] / fs * 1000 + + accuracy1 = tp_count1 / (tp_count1 + fn_count1) + accuracies.append(accuracy1) + similarities.append(similarity_matrix[r, c]) + + accuracy2 = tp_count2 / (tp_count2 + fn_count1) + accuracies.append(accuracy2) + similarities.append(similarity_matrix[r, c]) + + accuracies = np.array(accuracies) + similarities = np.array(similarities) + print(similarities) + print(accuracies) + order = np.argsort(similarities) + + similarities = similarities[order] + accuracies = accuracies[order, :] + + self.ax.matshow(accuracies) + + + + + + From 7d365dda230458207baf684c7f12c13d3fa790ca Mon Sep 17 00:00:00 2001 From: Samuel Garcia Date: Thu, 10 Sep 2020 18:05:41 +0200 Subject: [PATCH 03/13] wip with cosine similarity plots --- .../collisioncompwidget.py | 73 ++++++++++++++----- 1 file changed, 55 insertions(+), 18 deletions(-) diff --git a/spikewidgets/widgets/collisioncompwidget/collisioncompwidget.py b/spikewidgets/widgets/collisioncompwidget/collisioncompwidget.py index 32c710c..2acdedf 100644 --- a/spikewidgets/widgets/collisioncompwidget/collisioncompwidget.py +++ b/spikewidgets/widgets/collisioncompwidget/collisioncompwidget.py @@ -42,11 +42,13 @@ def plot_comparison_collision_pair_by_pair(comp, unit_ids=None, nbins=10, figure return W -def plot_comparison_collision_by_similarity(comp, templates, unit_ids=None, nbins=10, figure=None, ax=None): +def plot_comparison_collision_by_similarity(comp, templates, metric='cosine_similarity', + unit_ids=None, nbins=10, figure=None, ax=None): W = ComparisonCollisionBySimilarityWidget( comp=comp, templates=templates, + metric=metric, unit_ids=unit_ids, nbins=nbins, figure=figure, @@ -128,7 +130,7 @@ def _do_plot(self): class ComparisonCollisionBySimilarityWidget(BaseWidget): - def __init__(self, comp, templates, unit_ids=None, nbins=10, figure=None, ax=None): + def __init__(self, comp, templates, unit_ids=None, metric='cosine_similarity', nbins=10, figure=None, ax=None): BaseWidget.__init__(self, figure, ax) if unit_ids is None: # take all units @@ -138,15 +140,19 @@ def __init__(self, comp, templates, unit_ids=None, nbins=10, figure=None, ax=Non self.templates = templates self.unit_ids = unit_ids self.nbins = nbins + self.metric = metric def plot(self): self._do_plot() def _do_plot(self): - #~ fig = self.figure - ax = self.ax - #~ for ax in fig.axes: - #~ ax.remove() + fig = self.figure + + for ax in fig.axes: + ax.remove() + + + # compute similarity # take index of temmplate (respect unit_ids order) @@ -155,15 +161,20 @@ def _do_plot(self): #~ print('template_inds', template_inds) templates = self.templates[template_inds, :, :].copy() flat_templates = templates.reshape(templates.shape[0], -1) - similarity_matrix = sklearn.metrics.pairwise.cosine_distances(flat_templates) + if self.metric == 'cosine_similarity': + similarity_matrix = sklearn.metrics.pairwise.cosine_similarity(flat_templates) + else: + raise NotImplementedError('metric=...') + #~ print(similarity_matrix) n = len(self.unit_ids) fs = self.comp.sorting1.get_sampling_frequency() - accuracies = [] + recall_scores = [] similarities = [] + pair_names = [] for r in range(n): for c in range(r+1, n): @@ -176,26 +187,52 @@ def _do_plot(self): lags = bins[:-1] / fs * 1000 accuracy1 = tp_count1 / (tp_count1 + fn_count1) - accuracies.append(accuracy1) + recall_scores.append(accuracy1) similarities.append(similarity_matrix[r, c]) - - accuracy2 = tp_count2 / (tp_count2 + fn_count1) - accuracies.append(accuracy2) + pair_names.append(f'{u1} {u2}') + + accuracy2 = tp_count2 / (tp_count2 + fn_count2) + recall_scores.append(accuracy2) similarities.append(similarity_matrix[r, c]) + pair_names.append(f'{u2} {u1}') - accuracies = np.array(accuracies) + recall_scores = np.array(recall_scores) similarities = np.array(similarities) - print(similarities) - print(accuracies) - order = np.argsort(similarities) + pair_names = np.array(pair_names) + order = np.argsort(similarities) similarities = similarities[order] - accuracies = accuracies[order, :] + recall_scores = recall_scores[order, :] + pair_names = pair_names[order] + + + # plot + n_pair = len(similarities) + + ax0 = fig.add_axes([0.1 , 0.1 , .25 , 0.8 ] ) + ax1 = fig.add_axes([0.4 , 0.1 , .5 , 0.8 ] , sharey=ax0) - self.ax.matshow(accuracies) + plt.setp(ax1.get_yticklabels(), visible=False) + im = ax1.imshow(recall_scores[::-1, :], + cmap='viridis', + aspect='auto', + extent=(lags[0], lags[-1], -0.5, n_pair-0.5), + ) + im.set_clim(0,1) + ax0.plot(similarities, np.arange(n_pair), color='k') + ax0.set_yticks(np.arange(n_pair)) + ax0.set_yticklabels(pair_names) + #~ ax0.set_xlim(0,1) + ax0.set_xlabel(self.metric) + ax0.set_ylabel('pairs') + ax1.set_xlabel('lag [ms]') + + + + From e24ff227708acef14de74d9d35437db1bace9263 Mon Sep 17 00:00:00 2001 From: Samuel Garcia Date: Wed, 7 Oct 2020 20:48:18 +0200 Subject: [PATCH 04/13] imshow without interpolation --- spikewidgets/widgets/collisioncompwidget/collisioncompwidget.py | 1 + 1 file changed, 1 insertion(+) diff --git a/spikewidgets/widgets/collisioncompwidget/collisioncompwidget.py b/spikewidgets/widgets/collisioncompwidget/collisioncompwidget.py index 2acdedf..c931dd6 100644 --- a/spikewidgets/widgets/collisioncompwidget/collisioncompwidget.py +++ b/spikewidgets/widgets/collisioncompwidget/collisioncompwidget.py @@ -217,6 +217,7 @@ def _do_plot(self): im = ax1.imshow(recall_scores[::-1, :], cmap='viridis', aspect='auto', + interpolation='none', extent=(lags[0], lags[-1], -0.5, n_pair-0.5), ) im.set_clim(0,1) From d72e0901c2a608d0580fb8f94076c528a9be2bea Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Wed, 24 Feb 2021 19:22:59 +0100 Subject: [PATCH 05/13] Prepare for new release --- rasterplot_shaded.py | 0 spikewidgets/version.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 rasterplot_shaded.py diff --git a/rasterplot_shaded.py b/rasterplot_shaded.py new file mode 100644 index 0000000..e69de29 diff --git a/spikewidgets/version.py b/spikewidgets/version.py index 7b96c4d..b08fab3 100644 --- a/spikewidgets/version.py +++ b/spikewidgets/version.py @@ -1 +1 @@ -version = '0.5.1' +version = '0.5.2' From 1c1c8a66a9ec1b7a0b24f162bff11de6d162f042 Mon Sep 17 00:00:00 2001 From: Samuel Garcia Date: Tue, 9 Mar 2021 11:48:50 +0100 Subject: [PATCH 06/13] lazy import sklearn --- .../collisioncompwidget.py | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/spikewidgets/widgets/collisioncompwidget/collisioncompwidget.py b/spikewidgets/widgets/collisioncompwidget/collisioncompwidget.py index c931dd6..f2dc147 100644 --- a/spikewidgets/widgets/collisioncompwidget/collisioncompwidget.py +++ b/spikewidgets/widgets/collisioncompwidget/collisioncompwidget.py @@ -1,5 +1,5 @@ import numpy as np -import sklearn + from matplotlib import pyplot as plt import matplotlib.gridspec as gridspec @@ -11,7 +11,7 @@ def plot_comparison_collision_pair_by_pair(comp, unit_ids=None, nbins=10, figure=None, ax=None): """ - Plots multi sorting comparison graph. + Plots CollisionGTComparison pair by pair. Parameters ---------- @@ -44,6 +44,26 @@ def plot_comparison_collision_pair_by_pair(comp, unit_ids=None, nbins=10, figure def plot_comparison_collision_by_similarity(comp, templates, metric='cosine_similarity', unit_ids=None, nbins=10, figure=None, ax=None): + """ + Plots CollisionGTComparison pair by pair orderer by cosine_similarity + + Parameters + ---------- + comp: CollisionGTComparison + The collision ground truth comparison object + templates: array + template of units + metric: cosine_similarity', + metric for ordering + unit_ids: list + List of considered units + nbins: int + Number of bins + figure: matplotlib figure + The figure to be used. If not given a figure is created + ax: matplotlib axis + The axis to be used. If not given an axis is created + """ W = ComparisonCollisionBySimilarityWidget( comp=comp, @@ -146,6 +166,8 @@ def plot(self): self._do_plot() def _do_plot(self): + import sklearn + fig = self.figure for ax in fig.axes: @@ -166,7 +188,7 @@ def _do_plot(self): else: raise NotImplementedError('metric=...') - #~ print(similarity_matrix) + # print(similarity_matrix) n = len(self.unit_ids) From 1cffd114bb8667c5b2c38b5e8859c384d5a983db Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Tue, 9 Mar 2021 13:01:07 +0100 Subject: [PATCH 07/13] force numpy 1.20 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 43a5899..ee58622 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,9 +25,9 @@ install: - pip install https://github.com/SpikeInterface/spikeextractors/archive/master.zip - pip install https://github.com/SpikeInterface/spiketoolkit/archive/master.zip - pip install https://github.com/SpikeInterface/spikecomparison/archive/master.zip -- pip install requests - pip install networkx - pip install matplotlib +- pip install numpy==1.20 - pip install . - pip install pytest script: pytest From 23ce1352fedd8082ba55c6c3d03f1e768931d707 Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Tue, 9 Mar 2021 14:19:32 +0100 Subject: [PATCH 08/13] force numpy>=1.20 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ee58622..0317a69 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,7 +27,7 @@ install: - pip install https://github.com/SpikeInterface/spikecomparison/archive/master.zip - pip install networkx - pip install matplotlib -- pip install numpy==1.20 +- pip install numpy>=1.20 - pip install . - pip install pytest script: pytest From 90b37586c2b039aa36ce487f7c1ac72164b4c876 Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Thu, 11 Mar 2021 09:43:22 +0100 Subject: [PATCH 09/13] Fix version --- .travis.yml | 2 +- setup.py | 2 +- spikewidgets/version.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0317a69..8235cd7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,7 +27,7 @@ install: - pip install https://github.com/SpikeInterface/spikecomparison/archive/master.zip - pip install networkx - pip install matplotlib -- pip install numpy>=1.20 - pip install . +- pip install numpy>=1.20 - pip install pytest script: pytest diff --git a/setup.py b/setup.py index 1102561..ab400e3 100644 --- a/setup.py +++ b/setup.py @@ -19,7 +19,7 @@ install_requires=[ 'numpy', 'spiketoolkit>=0.7.2', - 'spikecomparison>=0.3.1', + 'spikecomparison>=0.3.2', 'matplotlib', 'MEAutility>=1.4.6' ], diff --git a/spikewidgets/version.py b/spikewidgets/version.py index b08fab3..fcc3d88 100644 --- a/spikewidgets/version.py +++ b/spikewidgets/version.py @@ -1 +1 @@ -version = '0.5.2' +version = '0.5.3' From 9b7aa0c93c2d386cadaa93d820ae75c00ab0a6ea Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Thu, 11 Mar 2021 10:21:21 +0100 Subject: [PATCH 10/13] numpy version should be fixed --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8235cd7..e28668d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,6 +28,5 @@ install: - pip install networkx - pip install matplotlib - pip install . -- pip install numpy>=1.20 - pip install pytest script: pytest From 52dcc96fb2d4fbeaec2741cb9d7f1c92115032f7 Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Thu, 11 Mar 2021 10:36:01 +0100 Subject: [PATCH 11/13] Check pip list --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index e28668d..6dbe819 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,8 +25,7 @@ install: - pip install https://github.com/SpikeInterface/spikeextractors/archive/master.zip - pip install https://github.com/SpikeInterface/spiketoolkit/archive/master.zip - pip install https://github.com/SpikeInterface/spikecomparison/archive/master.zip -- pip install networkx - pip install matplotlib - pip install . -- pip install pytest +- pip list script: pytest From babb9bf47e412c0c6d0f41ebd2f8c8ad7581d275 Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Thu, 11 Mar 2021 10:40:43 +0100 Subject: [PATCH 12/13] Pre-install and force numpy and pandas --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6dbe819..fc8bd3c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,10 +22,11 @@ jobs: env: PATH=/c/Python37:/c/Python37/Scripts:$PATH install: +- pip install numpy>=1.20 +- pip install pandas>=1.2 +- pip install matplotlib - pip install https://github.com/SpikeInterface/spikeextractors/archive/master.zip - pip install https://github.com/SpikeInterface/spiketoolkit/archive/master.zip - pip install https://github.com/SpikeInterface/spikecomparison/archive/master.zip -- pip install matplotlib - pip install . -- pip list script: pytest From 0e21ad962d4ff2b7fca5727b30ca63241fe6546a Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Thu, 11 Mar 2021 10:48:20 +0100 Subject: [PATCH 13/13] Re-insert pytest --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index fc8bd3c..16cf787 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,4 +29,5 @@ install: - pip install https://github.com/SpikeInterface/spiketoolkit/archive/master.zip - pip install https://github.com/SpikeInterface/spikecomparison/archive/master.zip - pip install . +- pip install pytest script: pytest