Files
digital-drosophila/models/male-cns-lif/apl-pn-scope-audit-v1/validate_localization.py
T

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))