35 lines
2.2 KiB
Python
35 lines
2.2 KiB
Python
"""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))
|