Audit APL PN scope and localize official synaptic contacts without changing frozen dynamics
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
"""Independent complete-pair-set and weight check (including entirely missing pairs)."""
|
||||
from pathlib import Path
|
||||
import json
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
from audit import save
|
||||
|
||||
ROOT=Path('/data/digital-drosophila');EXP=ROOT/'experiments/phase4aa-apl-pn-scope'
|
||||
c=ROOT/'datasets/male-cns-v1.0/processed/neuron-only'
|
||||
m=pd.read_parquet(c/'neuron-index/unified-metadata.parquet').sort_values('neuron_idx').reset_index(drop=True)
|
||||
ptr=np.load(c/'gpu/csr-indptr.int64.npy',mmap_mode='r');dst=np.load(c/'gpu/csr-indices.int32.npy',mmap_mode='r');w=np.load(c/'gpu/csr-weights.int64.npy',mmap_mode='r')
|
||||
src=np.repeat(np.arange(len(m),dtype=np.int32),np.diff(ptr))
|
||||
apl=np.flatnonzero(m.annotation_type.eq('APL'));kc=np.flatnonzero(m.annotation_class.eq('Kenyon_Cell'));alln=np.flatnonzero(m.annotation_class.eq('ALLN'))
|
||||
pn=pd.read_parquet(EXP/'connectivity/APL-PN-reciprocity.parquet').target_neuron_idx.unique()
|
||||
watch=json.loads((ROOT/'experiments/phase4z-pn-feedback-audit/protocol/watched.json').read_text())['all_incoming_ALPNs']
|
||||
selectors={
|
||||
'APL-incident':np.isin(src,apl)|np.isin(dst,apl),
|
||||
'APL-target-PN-to-KC':np.isin(src,pn)&np.isin(dst,kc),
|
||||
'watched-PN-to-ALLN':np.isin(src,watch)&np.isin(dst,alln),
|
||||
'ALLN-to-watched-PN':np.isin(src,alln)&np.isin(dst,watch)}
|
||||
results=[]
|
||||
for name,mask in selectors.items():
|
||||
frame=pd.read_parquet(EXP/'localization'/(name+'.parquet'))
|
||||
frame=frame[frame.source_neuron_idx.notna()&frame.target_neuron_idx.notna()]
|
||||
counts=frame.groupby(['source_neuron_idx','target_neuron_idx']).size().reset_index(name='weight')
|
||||
actual=counts.to_numpy(np.int64)
|
||||
ids=np.flatnonzero(mask)
|
||||
expected=np.column_stack((src[ids],dst[ids],w[ids])).astype(np.int64)
|
||||
actual=actual[np.lexsort((actual[:,1],actual[:,0]))];expected=expected[np.lexsort((expected[:,1],expected[:,0]))]
|
||||
passed=np.array_equal(actual,expected)
|
||||
results.append({'group':name,'expected_CSR_pairs':len(expected),'observed_pairs':len(actual),'complete_pair_set_and_weight_exact':passed})
|
||||
assert passed,name
|
||||
save(EXP/'localization/complete-pair-set-validation.json',{'pass':all(r['complete_pair_set_and_weight_exact'] for r in results),'groups':results})
|
||||
print(json.dumps(results,indent=2))
|
||||
Reference in New Issue
Block a user