-
Notifications
You must be signed in to change notification settings - Fork 0
/
PNInputEM.Rmd
233 lines (181 loc) · 5.5 KB
/
PNInputEM.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
---
title: "PNInputEM"
author: "Gregory Jefferis"
date: "27/06/2017"
output: html_document
---
# Intro
We're going to take a look at the inputs that Alex has found for the neurons
marked up as "Mike's C11"
```{r startup, message=FALSE}
library(elmr)
library(dplyr)
rgl::setupKnitr()
```
```{r, cache=TRUE}
mikec11=read.neurons.catmaid("annotation:^PD2a1/b1")
```
```{r, cache=TRUE}
pncc = catmaid_get_connectors_between('annotation:^PN$',
post_skids = "annotation:^PD2a1/b1")
```
Where are the inputs located? For each synapse, see if it's close to MB or LH
surface (a few outputs are closer to LH).
```{r}
lhr=as.mesh3d(subset(FAFB13NP.surf, "LH_R"))
mbr=as.mesh3d(subset(FAFB13NP.surf, "MB_CA_R"))
pncc %>%
select(connector_x:connector_z) %>%
pointsinside(surf = lhr, rval = 'dist') -> lhdist
pncc %>%
select(connector_x:connector_z) %>%
pointsinside(surf = mbr, rval = 'dist') -> mbdist
pncc$np=ifelse(mbdist>lhdist, "MB", "LH")
```
OK, let's summarise synapse location. Quite a few
```{r}
table(pncc$np)
table(pncc$post_skid, pncc$np)
```
Let's define some functions to handle PN names.
```{r}
get_names <- function(x) {
if(is.numeric(x)) catmaid_get_neuronnames(x) else x
}
glom <- function(x) {
nn=get_names(x)
stringr::str_match(nn, "[Gg]lomerulus ([A-z1-7]{1,}[^ ]*) ")[,2]
}
```
```{r}
table(pncc$np, glom(pncc$pre_skid), pncc$post_skid)
```
Now let's take a look at all connections onto the dendrites of LHNs
First fetch all connections
```{r}
incc = catmaid_get_connectors_between(post_skids = "annotation:^PD2a1/b1")
```
Now assign them to LH, Calyx or Other
```{r}
# less than 5 µm outside LH surface
inlh=pointsinside(incc[,c('connector_x', 'connector_y','connector_z')],
surf = lhr, rval = 'dist') > -5e3
inmb=pointsinside(incc[,c('connector_x', 'connector_y','connector_z')],
surf = mbr, rval = 'dist') > -5e3
incc$np='other'
incc$np[inlh]='LH'
incc$np[inmb]='MB'
table(incc$np)
```
```{r, webgl=TRUE}
clear3d()
points3d(incc[,c('post_node_x', 'post_node_y','post_node_z')],
col=rainbow(3)[factor(incc$np)])
wire3d(lhr)
```
OK now that we have divided inputs, let's look at fraction of them that are
PNs etc
```{r}
pn.ids=catmaid_skids('annotation:^PN$')
lhdone.ids=catmaid_skids('annotation:^LH_DONE$')
pn.done.ids=intersect(pn.ids, lhdone.ids)
a2sc.ids=catmaid_skids("annotation:^MBON a2sc")
```
```{r}
incc$intype='other'
incc$intype[incc$pre_skid%in%pn.ids]='PN'
incc$intype[incc$pre_skid%in%a2sc.ids]='a2sc'
```
Let's cross-classify inputs by presynaptic type and location:
```{r}
xt=xtabs(~intype+np, data = incc)
xt
```
So `r xt['a2sc','LH']/sum(xt[c('a2sc','PN'),'LH'])*100` of LH inputs are from
the a2sc.
Let's look at the relationship between input type and location
```{r, webgl=TRUE}
clear3d()
points3d(incc[,c('post_node_x', 'post_node_y','post_node_z')],
col=rainbow(3)[factor(incc$intype)])
wire3d(lhr)
```
Might want to check a few of those a2sc inputs for dendritic vs axonal.
Summarise by LHON
```{r}
incc %>%
filter(np=='LH') %>%
xtabs(~post_skid+intype, data=.)
```
```{r}
incc %>%
xtabs(~post_skid+intype+np, data=.)
```
## Unidentified inputs
For the unidentified inputs, would be nice to get an indication of
whether they are attached to big neurons or not. First for the MB.
```{r MB unidentified}
subset(incc, np=='MB' & intype!='PN')[,'pre_skid'] -> mbinputs
nn=catmaid_get_neuronnames(mbinputs)
data.frame(skid=names(nn), name=nn) %>%
group_by(skid, name) %>%
summarise(n=n()) %>%
arrange(desc(n)) -> sdf
knitr::kable(sdf)
```
Now for the LH
```{r LH unidentified}
subset(incc, np=='LH' & intype!='PN')[,'pre_skid'] -> lhinputs
lhnn=catmaid_get_neuronnames(lhinputs)
data.frame(skid=names(lhnn), name=lhnn) %>%
group_by(skid, name) %>%
summarise(n=n()) %>%
arrange(desc(n)) -> sdflh
plot(table(sdflh$n))
plot(ecdf(sdflh$n), verticals = T,
main = 'Cumulative Distribution Synaptic Partner Strength',
ylab='Cumulative Fraction Total Inputs',
xlab='Connections per partner')
# just take a look at inputs n>1
knitr::kable(filter(sdflh, n>1))
```
## Input clustering
Let's see if there is different classes of inputs are located on different
parts of the LHN dendritic tree. We could ask a few different questions.
* Is there any relationship between Strahler order and input type?
* Are inputs of the same type closer together by geodesic or Euclidean distance?
* I think geodesic might be more interesting and less obvious
Let's start by taking a looking using LHN with most inputs
```{r, rgl=TRUE}
with(subset(incc, post_skid==1299700 & pre_skid %in% a2sc.ids),
spheres3d(cbind(connector_x, connector_y, connector_z),
radius=300, col='green'))
```
### Strahler order
First calculate the strahler order for the connections
```{r}
incc$so=NA_integer_
for(n in mikec11){
so=strahler_order(n)
# which of the nodes in this neuron have synaptic input
post_node_idxs=which(n$d$PointNo%in%incc$post_node_id)
incc$so[match(n$d$PointNo[post_node_idxs],incc$post_node_id)]=
so$points[post_node_idxs]
}
```
Looking at these
```{r}
xx=xtabs(~so+I(intype=='PN'), data=subset(incc, np=="LH" & intype%in%c("PN","other")))
xx
summary(xx)
xx=xtabs(~so+I(intype=='PN'), data=subset(incc, np=="LH" & intype%in%c("PN","a2sc")))
xx
summary(xx)
```
The conclusion is that there are some small asymmetries in the distribution but
the effect sizes appear fairly small.
```{r, eval=FALSE}
incc %>%
filter(np=='LH' & intype=='other') %>%
xtabs(~post_skid+)
```