Male-specific P1 neuron analysis

Male-specific P1 neurons are believed to be key regulators of male sexual behaviour. These neurons originate from a single neuroblast (which appears to be present in both sexes) but the action of doublesex (in both sexes) results in the selective presence of a group of at least 30 neurons only in males [kimura 2008].

We have found that some of these neurons are present in females. And also found different subtypes of the male ones.

Setting Up

## glX 
##   1

Finding the P1 Neurons

Plot of single P1 neuron, showing the male enlarged regions (MER).

First let’s plot the MER defined by Cachero, Ostrovsky et al 2010.

MER=read.hxsurf("tvalsIS2-ascii.surf", RegionChoice = 'Outer')
MER=xform_brain(MER, ref=FCWB, sample=IS2)
op=structure(list(FOV = 0, userMatrix = structure(c(1, 0, 0, 0, 
0, -1, 0, 0, 0, 0, -1, 0, -11.4369961735046, 0.409557479101537, 
0, 1), .Dim = c(4L, 4L)), scale = c(1, 1, 1), zoom = 0.694575011730194), .Names = c("FOV", 
"userMatrix", "scale", "zoom"))
par3d(op)
plot3d(MER,col='red',alpha=0.3)

and then plot the P1 neuron fru-M-400046.

clear3d()
plot3d(FCWB)
op=structure(list(FOV = 0, userMatrix = structure(c(1, 0, 0, 0, 
0, -1, 0, 0, 0, 0, -1, 0, -12.0171653055846, -48.5492559524481, 
0, 1), .Dim = c(4L, 4L)), scale = c(1, 1, 1), zoom = 0.288610458374023), .Names = c("FOV", 
"userMatrix", "scale", "zoom"))
par3d(op)
plot3d("FruMARCM-M000769_seg002", col='black', soma=T, lwd=5)
plot3d(MER,col='red',alpha=0.3)

Plot again in a posterior view.

clear3d()
plot3d(FCWB)
op=structure(list(FOV = 0, userMatrix = structure(c(-1, 0, 0, 0, 
0, -1, 0, 0, 0, 0, 1, 0, 12.0171653055846, -48.5492559524481, 
0, 1), .Dim = c(4L, 4L)), scale = c(1, 1, 1), zoom = 0.288610458374023), .Names = c("FOV", 
"userMatrix", "scale", "zoom"))
par3d(op)
plot3d("FruMARCM-M000769_seg002", col='black', soma=T, lwd=5)
plot3d(MER,col='red',alpha=0.3)

We’ve already made a data.frame containing a set of P1 neurons along with other very similar neurons, starting from a search using a tracing of the P1 stalk from a neuroblast clone. Let’s load that up.

p1df=load_si_data('p1df.rds')
# see below for origin of this
missing.p1s=c("FruMARCM-M002554_seg001", "FruMARCM-M000150_seg004", "FruMARCM-F001932_seg001", 
"FruMARCM-F001491_seg001", "TPHMARCM-242F_seg1", "TPHMARCM-811F_seg1")
p1s=dps[union(p1df$item,missing.p1s)]

Let’s check the sex and driver line for these neurons.

with(p1s,table(Driver,Gender))
##             Gender
## Driver        F  M
##   Cha-Gal4    9  0
##   fru-Gal4    8 93
##   Gad1-Gal4   3  0
##   Trh-Gal4   13  5
##   VGlut-Gal4 12  0

So male fru-Gal4 neurons are the clear majority but, there is a significant number of non-fru and female neurons. Let’s cluster by morphology, also labelling the neurons by driver and showing the sex by the colour of the labels.

First we need to fetch/set a score matrix for these P1 neurons (to save time/bandwidth compared with downloading the 2Gb 16k x 16k scorematrix).

p1scoremat <- load_si_data("p1scoremat.rds")
options(flycircuit.scoremat="p1scoremat")

Now we can run the clustering.

hcp1s=hclustfc(names(p1s), unsquare = T)
dendp1s=color_clusters(hcp1s,k=2)
dendp1s=set_leaf_colours(dendp1s, col_to_set = 'label',
  col=with(p1s,structure(c(M='cyan',F='magenta')[Gender],.Names=gene_name)))
labels(dendp1s)=subset(p1s, subset = labels(dendp1s), rval='data.frame')$Driver
par(mar=c(4,2,0,0), cex=.6)
plot(dendp1s)

So there is a large group in which male fru neurons are the majority.

Plotting the neurons coloured by drivers emphasised that the main group are fru-Gal4 positive.

clear3d()
par3d(op)
par3d(zoom=0.7)
plot3d(p1s, col=factor(Driver), soma=T)

Looking at the clustering more closely, there are several odd ones out amongst the male fru-Gal4 neurons. We went back and checked the sex using the Dlg neuropil staining. Four of them turned out to be incorrect, while another six turn out to be bona fide female neurons that appear related to but distinct from the subgroup of male P1 neurons. Two of the female neurons are labelled by fru-Gal4, and all of this subgroup have identical primary neurites, so it seems rather likely that they are lineage related neurons that are not killed by the action of dsx (see Kimura et al 2008).

reallymale=c("FruMARCM-F000310_seg001","FruMARCM-F001393_seg001",
             "FruMARCM-F002616_seg001","FruMARCM-F001491_seg001")
reallyfemale=c("FruMARCM-F000626_seg001","ChaMARCM-F000757_seg001",
               "TPHMARCM-882F_seg1","TPHMARCM-827F_seg2", 
               "FruMARCM-F001932_seg001", "TPHMARCM-811F_seg1")
# fix sex in attached data.frame
attr(p1s,'df')[reallymale,'Gender']="M"

In any case, group 2 are the classic P1s. Let’s cut those at h=1 to see how many types that predicts:

p1s.sel=p1s[subset(hcp1s,k=2,group=2)]
hcp1s.g2=hclustfc(names(p1s.sel), unsquare = T)
dendp1s.g2=color_clusters(hcp1s.g2,h=1, groupLabels=as.integer)
dendp1s.g2=set_leaf_colours(dendp1s.g2, col_to_set = 'label',
  col=with(p1s[labels(dendp1s.g2)],structure(c(M='cyan',F='magenta')[Gender],.Names=gene_name)))
labels(dendp1s.g2)=subset(p1s, subset = labels(dendp1s.g2), rval='data.frame')$Driver
par(mar=c(4,2,0,0), cex=0.5)
plot(dendp1s.g2)
abline(h=height_for_ngroups(hc=hcp1s.g2, k=10), lty='dashed')

i.e. there are 10 groups when h=0.92 (dashed line) and 20 groups when h=0.75 (dotted line).

Plot all groups.

clear3d()
plot3d(FCWB,alpha=0)
plot3d(hcp1s.g2, h=1, soma = T)
op=structure(list(FOV = 0, userMatrix = structure(c(1, 0, 0, 0, 
0, -1, 0, 0, 0, 0, -1, 0, -14.7076296339779, -46.2984371382541, 
0, 1), .Dim = c(4L, 4L)), scale = c(1, 1, 1), zoom = 0.290864706039429), .Names = c("FOV", 
"userMatrix", "scale", "zoom"))
par3d(op)

Plot each group in turn.

Group 1.

npop3d()
plot3d(hcp1s.g2, h=1, groups=1, soma = T)
par3d(op)

Group 2.

npop3d()
plot3d(hcp1s.g2, h=1, groups=2, soma = T)
par3d(op)

Group 3.

npop3d()
plot3d(hcp1s.g2, h=1, groups=3, soma = T)
par3d(op)

Group 4.

npop3d()
plot3d(hcp1s.g2, h=1, groups=4, soma = T)
par3d(op)

Group 5.

npop3d()
plot3d(hcp1s.g2, h=1, groups=5, soma = T)
par3d(op)

Group 6.

npop3d()
plot3d(hcp1s.g2, h=1, groups=6, soma = T)
par3d(op)

Group 7.

npop3d()
plot3d(hcp1s.g2, h=1, groups=7, soma = T)
par3d(op)

Group 8.

npop3d()
plot3d(hcp1s.g2, h=1, groups=8, soma = T)
par3d(op)

Group 9.

npop3d()
plot3d(hcp1s.g2, h=1, groups=9, soma = T)
plot3d(MER,col='grey',alpha=0.3)
par3d(op)

Group 10.

npop3d()
plot3d(hcp1s.g2, h=1, groups=10, soma = T)
plot3d(MER,col='grey',alpha=0.3)
par3d(op)

Plot 9 and 10, male and female respectively.

clear3d()
op2=structure(list(FOV = 0, userMatrix = structure(c(1, 0, 0, 0, 
0, -1, 0, 0, 0, 0, -1, 0, -3.52978142126604, -10.280928396998, 
0, 1), .Dim = c(4L, 4L)), scale = c(1, 1, 1), zoom = 0.634920716285706), .Names = c("FOV", 
"userMatrix", "scale", "zoom"))
par3d(op2)
plot3d(subset(hcp1s.g2, h=1, groups=9),col='cyan', soma = T)
plot3d(subset(hcp1s.g2, h=1, groups=10),col='magenta', soma = T)

We can also compare with affinity propagation clustering. We use a p value of 0.5, since this increases the number of classes, taking us closer to the cut thresholds we are using in the hierarchical clustering. A similarity score of 0.5 is a reasonable estimate for a type from the PN clustering data.

apresp1s=apclusterfc(names(p1s.sel), p=0.5)
p1ex=names(apresp1s@exemplars)

so this gives 15 exemplars.

Have we missed any P1 neurons? Our approach involved a manual sifting step after affinity propagation. We can try searching with the exemplar neurons from the affinity propagation to see if there are any good hits left in the database:

# p1exsc=fc_nblast(p1ex,normalisation='mean')
# rather than runnig the search (which requires the full all by all score matrix)
# just load the scores
p1exsc=load_si_data("p1exsc.rds")

recheck=names(which(apply(p1exsc,1,function(x) any(x>0.4))))

# we plotted the the ones that we had not already inspected
#clear3d()
#plot3d(setdiff(recheck,names(p1s)), soma=T)

# after plotting them, picked up these 6 neurons with P1 type primary neurites
missing.p1s=c("FruMARCM-M002554_seg001", "FruMARCM-M000150_seg004", "FruMARCM-F001932_seg001", 
"FruMARCM-F001491_seg001", "TPHMARCM-242F_seg1", "TPHMARCM-811F_seg1")
nonp1=setdiff(recheck, union(missing.p1s,names(p1s.sel)))

Interestingly, there is a second large group of neurons in there that have very similar arborisation patterns to the P1s. Let’s cluster and pull them out:

hcnonp1=hclustfc(nonp1, unsquare = T)
## Warning: Dropping 204 target neurons.
## Warning: Dropping 204 query neurons.
dnonp1=color_clusters(hcnonp1,k=2)
labels(dnonp1)=NULL
par(mar=c(0,2,0,0))
plot(dnonp1)

# dendp1s.g2=set_leaf_colours(dendp1s.g2, col_to_set = 'label',
#   col=with(p1s[labels(dendp1s.g2)],structure(c(M='cyan',F='magenta')[Gender],.Names=gene_name)))
# labels(dendp1s.g2)=subset(p1s, subset = labels(dendp1s.g2), rval='data.frame')$Driver
# plot(dendp1s.g2)

Plot group 2.

clear3d()
par3d(op)
plot3d(hcnonp1,k=2, group=2, soma=T)