### Name: semsim
### Title: Compute semantic similarity measure for terms in an
###   object-ontology complex
### Aliases: semsim pms subsumers conceptProbs usageCount
### Keywords: models

### ** Examples

#
# we are given a graph of GOMF and the OOmap between LL and GOMF
# derived from humanLLMappings and stored as data resources in
# ontoTools -- these will have to be updated regularly
#
data(goMFgraph.1.15)
data(LL2GOMFooMap.1.15)
#
# build the rooted DAG, the ontology, and the OOC objects
#
gomfrDAG <- new("rootedDAG", root="GO:0003674", DAG=goMFgraph.1.15)
GOMFonto <- new("ontology", name="GOMF", version="bioc GO 1.15", rDAG=gomfrDAG)
LLGOMFOOC <- makeOOC(GOMFonto, LL2GOMFooMap.1.15)
#
# we are given the accessibility matrix for the GO MF graph as a 
# data resource, and we can compute some term probabilities
#
data(goMFamat.1.15)
pc <- conceptProbs(LLGOMFOOC, goMFamat.1.15, inds=1:20)
#
# now we will get a sample of GO MF terms and compute the
# semantic similarities of pairs of terms in the sample
#
data(LL2GOMFcp.1.15) # full set of precomputed concept probabilities
library(GO)
library(Biobase)
library(combinat)
 library(annotate)
GO() # get the GO environments
GOtags <- ls(env=GOTERM)
GOlabs <- mget(GOtags, env=GOTERM, ifnotfound=NA)
GOMFtags <- GOtags[ sapply(GOlabs,Ontology)=="MF" ]
GOMFtags <- GOMFtags[!is.na(GOMFtags)]
GOMFtermObs <- mget(GOMFtags,env=GOTERM)
GOMFterms <- sapply( GOMFtermObs, Term )
ntags <- length(GOMFtags)
if (any(duplicated(GOMFterms)))
 {
 dups <- (1:ntags)[duplicated(GOMFterms)]
 GOMFterms[dups] <- paste(GOMFterms[dups],".2",sep="")
 }
#names(GOMFterms) <- GOMFtags
set.seed(1234)
# does not lead to common samples across platforms...
st <- sample(names(GOMFterms),size=50) # take the sample
st <- intersect(st, names(LL2GOMFcp.1.15))[1:10] # use only those terms available in bioc GO 1.15
# thus ...
st = c("GO:0004397", "GO:0030215", "GO:0042802", "GO:0008504", "GO:0008640", 
"GO:0008528", "GO:0008375", "GO:0005436", "GO:0004756", "GO:0003729"
)
pst <- combn(st,2)   # get a matrix with the pairs of terms in columns
bad = c(4L, 12L, 19L, 25L, 31L, 32L, 33L, 34L, 35L) # can't use 8640
pst = pst[,-bad]
npst <- ncol(pst)
ss <- rep(NA,npst)
for (i in 1:npst)  # compute semantic similarities
  {
  cat(i)
  ss[i] <- semsim( pst[1,i], pst[2,i], ooc=LLGOMFOOC, acc=goMFamat.1.15, pc=LL2GOMFcp.1.15 )
  }
print(summary(ss))
top <- (1:npst)[ss==max(ss,na.rm=TRUE)][1]  # index of the most similar pair
             # note -- must come to an understanding of the NAs
print( GOMFterms[ as.character(pst[,top]) ] )
pen <- (1:npst)[ss==max(ss[-top],na.rm=TRUE)][1] # second most similar
print( GOMFterms[ as.character(pst[,pen]) ] )



