Skip to content

Commit cc0560c

Browse files
authored
Merge pull request #374 from int-brain-lab/alignment_qc_pykilosort
Alignment qc pykilosort
2 parents 2a194e7 + f7010f5 commit cc0560c

File tree

2 files changed

+44
-16
lines changed

2 files changed

+44
-16
lines changed

ibllib/qc/alignment_qc.py

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from ibllib.atlas import AllenAtlas
66
from ibllib.atlas.regions import BrainRegions
77
from ibllib.pipes import histology
8-
from ibllib.ephys.neuropixel import SITES_COORDINATES
98
from ibllib.pipes.ephys_alignment import EphysAlignment
109
from ibllib.qc import base
1110
from ibllib.oneibl.patcher import FTPPatcher
@@ -20,14 +19,15 @@ class AlignmentQC(base.QC):
2019
Class that is used to update the extended_qc of the probe insertion fields with the results
2120
from the ephys alignment procedure
2221
"""
23-
def __init__(self, probe_id, one=None, brain_atlas=None, channels=True):
22+
def __init__(self, probe_id, one=None, brain_atlas=None, channels=True, collection=None):
2423
super().__init__(probe_id, one=one, log=_log, endpoint='insertions')
2524

2625
# Data
2726
self.alignments = None
2827
self.xyz_picks = None
2928
self.depths = None
3029
self.cluster_chns = None
30+
self.chn_coords = None
3131
self.align_keys_sorted = None
3232

3333
# Metrics and passed trials
@@ -43,7 +43,10 @@ def __init__(self, probe_id, one=None, brain_atlas=None, channels=True):
4343
self.resolved = (self.insertion.get('json', {'temp': 0}).get('extended_qc').
4444
get('alignment_resolved', False))
4545

46-
def load_data(self, prev_alignments=None, xyz_picks=None, depths=None, cluster_chns=None):
46+
self.probe_collection = collection
47+
48+
def load_data(self, prev_alignments=None, xyz_picks=None, depths=None, cluster_chns=None,
49+
chn_coords=None):
4750
""""
4851
Load data required to assess alignment qc and compute similarity matrix. If no arguments
4952
are given load_data will fetch all the relevant data required
@@ -71,16 +74,29 @@ def load_data(self, prev_alignments=None, xyz_picks=None, depths=None, cluster_c
7174
else:
7275
self.xyz_picks = xyz_picks
7376

77+
if not self.probe_collection:
78+
all_collections = self.one.list_collections(self.insertion['session'])
79+
if f'alf/{self.insertion["name"]}/pykilosort' in all_collections:
80+
self.probe_collection = f'alf/{self.insertion["name"]}/pykilosort'
81+
else:
82+
self.probe_collection = f'alf/{self.insertion["name"]}'
83+
84+
if not np.any(chn_coords):
85+
self.chn_coords = self.one.load_dataset(self.insertion['session'],
86+
'channels.localCoordinates.npy',
87+
collection=self.probe_collection)
88+
else:
89+
self.chn_coords = chn_coords
90+
7491
if not np.any(depths):
75-
self.depths = SITES_COORDINATES[:, 1]
92+
self.depths = self.chn_coords[:, 1]
7693
else:
7794
self.depths = depths
7895

7996
if not np.any(cluster_chns):
8097
self.cluster_chns = self.one.load_dataset(self.insertion['session'],
8198
'clusters.channels.npy',
82-
collection=f'alf/{self.insertion["name"]}',
83-
download_only=True)
99+
collection=self.probe_collection)
84100
else:
85101
self.cluster_chns = cluster_chns
86102

@@ -142,7 +158,7 @@ def run(self, update=True, upload_alyx=True, upload_flatiron=True):
142158
if update:
143159
self.update_extended_qc(results)
144160

145-
if results['alignment_resolved'] and (upload_alyx or upload_flatiron):
161+
if results['alignment_resolved'] and np.bitwise_or(upload_alyx, upload_flatiron):
146162
self.upload_channels(results['alignment_stored'], upload_alyx, upload_flatiron)
147163

148164
return results
@@ -281,7 +297,7 @@ def upload_channels(self, alignment_key, upload_alyx, upload_flatiron):
281297
if upload_flatiron:
282298
ftp_patcher = FTPPatcher(one=self.one)
283299
insertion = self.one.alyx.get(f'/insertions/{self.eid}', clobber=True)
284-
alf_path = self.one.eid2path(insertion['session']).joinpath('alf', insertion['name'])
300+
alf_path = self.one.eid2path(insertion['session']).joinpath(self.probe_collection)
285301
alf_path.mkdir(exist_ok=True, parents=True)
286302

287303
# Make the channels.mlapdv dataset
@@ -318,7 +334,7 @@ def upload_channels(self, alignment_key, upload_alyx, upload_flatiron):
318334
if upload_alyx:
319335
if alignment_key != self.align_keys_sorted[0]:
320336
histology.register_aligned_track(self.eid, channels_mlapdv / 1e6,
321-
chn_coords=SITES_COORDINATES, one=self.one,
337+
chn_coords=self.chn_coords, one=self.one,
322338
overwrite=True, channels=self.channels)
323339

324340
ephys_traj = self.one.alyx.get(f'/trajectories?&probe_insertion={self.eid}'

ibllib/tests/qc/test_alignment_qc.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from ibllib.pipes.misc import create_alyx_probe_insertions
1313
from ibllib.qc.alignment_qc import AlignmentQC
1414
from ibllib.pipes.histology import register_track
15+
from ibllib.ephys.neuropixel import SITES_COORDINATES
1516

1617

1718
EPHYS_SESSION = 'b1c968ad-4874-468d-b2e4-5ffa9b9964e9'
@@ -135,7 +136,8 @@ def _03_alignments_disagree(self):
135136
traj = one.alyx.rest('trajectories', 'update', id=self.prev_traj_id, data=trajectory)
136137
align_qc = AlignmentQC(self.probe_id, one=one, brain_atlas=brain_atlas, channels=False)
137138
align_qc.load_data(prev_alignments=traj['json'], xyz_picks=np.array(self.xyz_picks) / 1e6,
138-
cluster_chns=self.cluster_chns)
139+
cluster_chns=self.cluster_chns, depths=SITES_COORDINATES[:, 1],
140+
chn_coords=SITES_COORDINATES)
139141
align_qc.run(update=True, upload_alyx=True, upload_flatiron=False)
140142

141143
_verify(self, alignment_qc=0.782216, alignment_resolved=False,
@@ -151,7 +153,8 @@ def _04_alignments_agree(self):
151153
traj = one.alyx.rest('trajectories', 'update', id=self.prev_traj_id, data=trajectory)
152154
assert(self.prev_traj_id == traj['id'])
153155
align_qc = AlignmentQC(self.probe_id, one=one, brain_atlas=brain_atlas, channels=False)
154-
align_qc.load_data(cluster_chns=self.cluster_chns)
156+
align_qc.load_data(cluster_chns=self.cluster_chns, depths=SITES_COORDINATES[:, 1],
157+
chn_coords=SITES_COORDINATES)
155158
align_qc.run(update=True, upload_alyx=True, upload_flatiron=False)
156159

157160
_verify(self, alignment_resolved='qc', alignment_qc=0.952319, trajectory_created=False,
@@ -165,7 +168,8 @@ def _05_not_latest_alignments_agree(self):
165168
self.assertEqual(self.prev_traj_id, traj['id'])
166169
align_qc = AlignmentQC(self.probe_id, one=one, brain_atlas=brain_atlas, channels=False)
167170
align_qc.load_data(prev_alignments=traj['json'], xyz_picks=np.array(self.xyz_picks) / 1e6,
168-
cluster_chns=self.cluster_chns)
171+
cluster_chns=self.cluster_chns, depths=SITES_COORDINATES[:, 1],
172+
chn_coords=SITES_COORDINATES)
169173
align_qc.resolved = 0
170174
align_qc.run(update=True, upload_alyx=True, upload_flatiron=False)
171175

@@ -220,7 +224,9 @@ def _01_normal_computation(self):
220224
align_qc = AlignmentQC(self.probe_id, one=one, brain_atlas=brain_atlas, channels=False)
221225
align_qc.load_data(prev_alignments=self.traj['json'],
222226
xyz_picks=np.array(self.xyz_picks) / 1e6,
223-
cluster_chns=self.cluster_chns)
227+
cluster_chns=self.cluster_chns,
228+
depths=SITES_COORDINATES[:, 1],
229+
chn_coords=SITES_COORDINATES)
224230
align_qc.run(update=True, upload_alyx=True, upload_flatiron=False)
225231
_verify(self,
226232
alignment_resolved=False,
@@ -233,7 +239,9 @@ def _02_manual_resolution_latest(self):
233239
align_qc = AlignmentQC(self.probe_id, one=one, brain_atlas=brain_atlas, channels=False)
234240
align_qc.load_data(prev_alignments=self.traj['json'],
235241
xyz_picks=np.array(self.xyz_picks) / 1e6,
236-
cluster_chns=self.cluster_chns)
242+
cluster_chns=self.cluster_chns,
243+
depths=SITES_COORDINATES[:, 1],
244+
chn_coords=SITES_COORDINATES)
237245
align_qc.resolve_manual('2020-09-28T15:57:25_mayo', update=True, upload_alyx=True,
238246
upload_flatiron=False)
239247
_verify(self,
@@ -247,7 +255,9 @@ def _03_manual_resolution_not_latest(self):
247255
align_qc = AlignmentQC(self.probe_id, one=one, brain_atlas=brain_atlas, channels=False)
248256
align_qc.load_data(prev_alignments=self.traj['json'],
249257
xyz_picks=np.array(self.xyz_picks) / 1e6,
250-
cluster_chns=self.cluster_chns)
258+
cluster_chns=self.cluster_chns,
259+
depths=SITES_COORDINATES[:, 1],
260+
chn_coords=SITES_COORDINATES)
251261
align_qc.resolve_manual('2020-09-28T10:03:06_alejandro', update=True, upload_alyx=True,
252262
upload_flatiron=False, force=True)
253263
_verify(self,
@@ -329,7 +339,9 @@ def setUpClass(cls) -> None:
329339
align_qc = AlignmentQC(cls.probe_id, one=one, brain_atlas=brain_atlas, channels=False)
330340
align_qc.load_data(prev_alignments=cls.traj['json'],
331341
xyz_picks=np.array(cls.xyz_picks) / 1e6,
332-
cluster_chns=cls.cluster_chns)
342+
cluster_chns=cls.cluster_chns,
343+
depths=SITES_COORDINATES[:, 1],
344+
chn_coords=SITES_COORDINATES)
333345
cls.file_paths = align_qc.resolve_manual('2020-09-28T15:57:25_mayo', update=True,
334346
upload_alyx=True, upload_flatiron=True)
335347
print(cls.file_paths)

0 commit comments

Comments
 (0)