diff biodb-common.R @ 2:20d69a062da3 draft

planemo upload for repository https://github.com/workflow4metabolomics/lcmsmatching.git commit d4048accde6bdfd5b3e14f5394902d38991854f8
author prog
date Thu, 02 Mar 2017 08:55:00 -0500
parents 253d531a0193
children
line wrap: on
line diff
--- a/biodb-common.R	Sat Sep 03 17:02:01 2016 -0400
+++ b/biodb-common.R	Thu Mar 02 08:55:00 2017 -0500
@@ -1,12 +1,13 @@
-if ( ! exists('BIODB.COMPOUND')) { # Do not load again if already loaded
+if ( ! exists('BIODB.XML')) {
 
 	###############
-	# ENTRY TYPES #
+	# CACHE MODES #
 	###############
 
-	BIODB.COMPOUND <- 'compound'
-	BIODB.SPECTRUM <- 'spectrum'
-	
+	BIODB.CACHE.READ.ONLY  <- 'read-only'
+	BIODB.CACHE.READ.WRITE <- 'read-write'
+	BIODB.CACHE.WRITE.ONLY <- 'write-only'
+
 	#######################
 	# ENTRY CONTENT TYPES #
 	#######################
@@ -16,7 +17,7 @@
 	BIODB.XML  <- 'xml'
 	BIODB.CSV  <- 'csv'
 	BIODB.DATAFRAME  <- 'dataframe'
-	BIODB.ANY  <- 'any' # Value used when we do not care about the type.
+	BIODB.JSON <- 'json'
 
 	#############
 	# DATABASES #
@@ -24,7 +25,8 @@
 
 	BIODB.CHEBI        <- 'chebi'
 	BIODB.KEGG         <- 'kegg'
-	BIODB.PUBCHEM      <- 'pubchem'
+	BIODB.PUBCHEMCOMP  <- 'pubchemcomp' # Compound database
+	BIODB.PUBCHEMSUB   <- 'pubchemsub'  # Substance database
 	BIODB.HMDB         <- 'hmdb'
 	BIODB.CHEMSPIDER   <- 'chemspider'
 	BIODB.ENZYME       <- 'enzyme'
@@ -35,6 +37,9 @@
 	BIODB.UNIPROT      <- 'uniprot'
 	BIODB.MASSBANK     <- 'massbank'
 	BIODB.MASSFILEDB   <- 'massfiledb'
+	BIODB.PEAKFOREST   <- 'peakforest'
+
+	BIODB.DATABASES <- c(BIODB.CHEBI, BIODB.KEGG, BIODB.PUBCHEMCOMP, BIODB.PUBCHEMSUB, BIODB.HMDB, BIODB.CHEMSPIDER, BIODB.ENZYME, BIODB.LIPIDMAPS, BIODB.MIRBASE, BIODB.NCBIGENE, BIODB.NCBICCDS, BIODB.UNIPROT, BIODB.MASSBANK, BIODB.MASSFILEDB, BIODB.PEAKFOREST)
 
 	##########
 	# FIELDS #
@@ -44,6 +49,11 @@
 	BIODB.DESCRIPTION  <- 'description'
 	BIODB.PROTEIN.DESCRIPTION  <- 'protdesc'
 	BIODB.NAME         <- 'name'
+	BIODB.COMP.IUPAC.NAME.ALLOWED  <- 'comp.iupac.name.allowed'
+	BIODB.COMP.IUPAC.NAME.TRAD     <- 'comp.iupac.name.trad'
+	BIODB.COMP.IUPAC.NAME.SYST     <- 'comp.iupac.name.syst'
+	BIODB.COMP.IUPAC.NAME.PREF     <- 'comp.iupac.name.pref'
+	BIODB.COMP.IUPAC.NAME.CAS      <- 'comp.iupac.name.cas'
 	BIODB.FULLNAMES    <- 'fullnames'
 	BIODB.SYNONYMS     <- 'synonyms'
 	BIODB.SYMBOL       <- 'symbol'
@@ -55,8 +65,13 @@
 	BIODB.ENZYME.ID    <- 'enzymeid'
 	BIODB.NCBI.CCDS.ID <- 'ncbiccdsid'
 	BIODB.NCBI.GENE.ID <- 'ncbigeneid'
-	BIODB.PUBCHEM.ID   <- 'pubchemid'
+	BIODB.PUBCHEMCOMP.ID   <- 'pubchemcompid'
+	BIODB.PUBCHEMSUB.ID   <- 'pubchemsubid'
+	BIODB.CHEMSPIDER.ID   <- 'chemspiderid'
 	BIODB.UNIPROT.ID   <- 'uniprotid'
+	BIODB.CAS.ID        <- 'casid'
+	BIODB.PEAKFOREST.ID <- 'peakforestid'
+	BIODB.SMILES        <- 'smiles'
 	BIODB.INCHI        <- 'inchi'
 	BIODB.INCHIKEY     <- 'inchikey'
 	BIODB.MSDEV        <- 'msdev'
@@ -75,70 +90,134 @@
 	BIODB.LENGTH       <- 'length'
 	BIODB.NB.PEAKS     <- 'nbpeaks'
 	BIODB.PEAKS        <- 'peaks'
+	BIODB.COMPOUNDS    <- 'compounds'
+    BIODB.NB.COMPOUNDS <- 'nbcompounds'
 	BIODB.COMPOUND.ID   <- 'compoundid'
-	BIODB.PEAK.MZ       <- 'peakmz'
-	BIODB.PEAK.COMP     <- 'peakcomp' # Peak composition
-	BIODB.PEAK.ATTR     <- 'peakattr' # Peak attribution
+	BIODB.COMPOUND.MASS   <- 'compoundmass'
+	BIODB.COMPOUND.COMP   <- 'compoundcomp'
 	BIODB.CHROM.COL     <- 'chromcol' # Chromatographic column
 	BIODB.CHROM.COL.RT  <- 'chromcolrt' # Retention time measured on chromatographic column
 	BIODB.ID <- 'id'
 	BIODB.TITLE <- 'title'
+	BIODB.PEAK.MZ <- 'mz'
+	BIODB.PEAK.RT <- 'rt'
+	BIODB.PEAK.MZEXP <- 'mzexp'
+	BIODB.PEAK.MZTHEO <- 'mztheo'
+	BIODB.PEAK.FORMULA <- 'formula'
+	BIODB.PEAK.FORMULA.COUNT <- 'formula.count'
+	BIODB.PEAK.COMP     <- 'peakcomp' # Peak composition
+	BIODB.PEAK.ATTR     <- 'peakattr' # Peak attribution
+	BIODB.PEAK.MASS <- 'mass'
+#	BIODB.PEAK.ATTR <- 'attr'
+	BIODB.PEAK.ERROR.PPM <- 'error.ppm'
+	BIODB.PEAK.INTENSITY <- 'intensity'
+	BIODB.PEAK.RELATIVE.INTENSITY <- 'relative.intensity'
 
 	# Mode values
 	BIODB.MSMODE.NEG <- 'neg'
 	BIODB.MSMODE.POS <- 'pos'
 
+    # Tolerance values
+	BIODB.TOL <- 'mztol'
+	BIODB.MZTOLUNIT.PPM <- 'ppm'
+	BIODB.MZTOLUNIT.PLAIN <- 'plain' # same as mz: mass-to-charge ratio
+	BIODB.MZTOLUNIT.VALS <- c(BIODB.MZTOLUNIT.PPM, BIODB.MZTOLUNIT.PLAIN)
+	
+	########################
+	# MS-MS MEASURE VALUES #
+	########################
+	
+	BIODB.MSMS.DIST.COS <- "cosine"
+	BIODB.MSMS.DIST.WCOSINE <- "wcosine"
+	BIODB.MSMS.DIST.PKERNEL <- "pkernel"
+	BIODB.MSMS.DIST <- c(BIODB.MSMS.DIST.COS, BIODB.MSMS.DIST.WCOSINE, BIODB.MSMS.DIST.PKERNEL)
+	
+	
 	#################
 	# CARDINALITIES #
 	#################
 
 	BIODB.CARD.ONE <- '1'
 	BIODB.CARD.MANY <- '*'
+	
+	#####################
+	#INTENSITy NOTATIONS#
+	#####################
+	
+	BIODB.GROUP.INTENSITY<-c(BIODB.PEAK.INTENSITY,BIODB.PEAK.RELATIVE.INTENSITY)
 
 	##########################
 	# ENTRY FIELD ATTRIBUTES #
 	##########################
-
+	# FIELD NAME                CLASS           CARDINALITY			TYPE  
 	BIODB.FIELDS <- data.frame(matrix(c(
-		# FIELD NAME                CLASS           CARDINALITY
-		BIODB.COMPOUND,            'BiodEntry',    BIODB.CARD.ONE,
-		BIODB.ACCESSION,           'character',    BIODB.CARD.ONE,
-		BIODB.DESCRIPTION,         'character',    BIODB.CARD.ONE,
-		BIODB.NAME,                'character',    BIODB.CARD.ONE,
-		BIODB.FULLNAMES,           'character',    BIODB.CARD.MANY,
-		BIODB.SYNONYMS,            'character',    BIODB.CARD.MANY,
-		BIODB.PROTEIN.DESCRIPTION, 'character',    BIODB.CARD.ONE,
-		BIODB.SYMBOL,              'character',    BIODB.CARD.ONE,
-		BIODB.GENE.SYMBOLS,        'character',    BIODB.CARD.MANY,
-		BIODB.CHEBI.ID,            'character',    BIODB.CARD.ONE,
-		BIODB.LIPIDMAPS.ID,        'character',    BIODB.CARD.ONE,
-		BIODB.KEGG.ID,             'character',    BIODB.CARD.ONE,
-		BIODB.HMDB.ID,             'character',    BIODB.CARD.ONE,
-		BIODB.ENZYME.ID,           'character',    BIODB.CARD.ONE,
-		BIODB.PUBCHEM.ID,          'character',    BIODB.CARD.ONE,
-		BIODB.UNIPROT.ID,          'character',    BIODB.CARD.ONE,
-		BIODB.NCBI.CCDS.ID,        'character',    BIODB.CARD.ONE,
-		BIODB.NCBI.GENE.ID,        'character',    BIODB.CARD.ONE,
-		BIODB.INCHI,               'character',    BIODB.CARD.ONE,
-		BIODB.INCHIKEY,            'character',    BIODB.CARD.ONE,
-		BIODB.MSDEV,               'character',    BIODB.CARD.ONE,
-		BIODB.MSDEVTYPE,           'character',    BIODB.CARD.ONE,
-		BIODB.MSTYPE,              'character',    BIODB.CARD.ONE,
-		BIODB.MSMODE,              'character',    BIODB.CARD.ONE,
-		BIODB.MSPRECMZ,            'double',       BIODB.CARD.ONE,
-		BIODB.MSPRECANNOT,         'character',    BIODB.CARD.ONE,
-		BIODB.FORMULA,             'character',    BIODB.CARD.ONE,
-		BIODB.SUPER.CLASS,         'character',    BIODB.CARD.ONE,
-		BIODB.MASS,                'double',       BIODB.CARD.ONE,
-		BIODB.AVERAGE.MASS,        'double',       BIODB.CARD.ONE,
-		BIODB.MONOISOTOPIC.MASS,   'double',       BIODB.CARD.ONE,
-		BIODB.SEQUENCE,            'character',    BIODB.CARD.ONE,
-		BIODB.LENGTH,              'integer',      BIODB.CARD.ONE,
-		BIODB.LOCATION,            'character',    BIODB.CARD.ONE,
-		BIODB.NB.PEAKS,            'integer',      BIODB.CARD.ONE,
-		BIODB.PEAKS,               'data.frame',   BIODB.CARD.ONE
-		), byrow = TRUE, ncol = 3), stringsAsFactors = FALSE)
-	colnames(BIODB.FIELDS) <- c('name', 'class', 'cardinality')
+		BIODB.ACCESSION,            'character',    BIODB.CARD.ONE,		'none',
+		BIODB.DESCRIPTION,          'character',    BIODB.CARD.ONE,		'none',
+		BIODB.NAME,                 'character',    BIODB.CARD.ONE,		'name',
+		BIODB.COMP.IUPAC.NAME.ALLOWED,	'character',    BIODB.CARD.ONE,		'name',
+		BIODB.COMP.IUPAC.NAME.TRAD,    	'character',    BIODB.CARD.ONE,		'name',
+		BIODB.COMP.IUPAC.NAME.SYST,    	'character',    BIODB.CARD.ONE,		'name',
+		BIODB.COMP.IUPAC.NAME.PREF,    	'character',    BIODB.CARD.ONE,		'name',
+		BIODB.COMP.IUPAC.NAME.CAS,    	'character',    BIODB.CARD.ONE,		'name',
+		BIODB.FULLNAMES,            'character',    BIODB.CARD.MANY,	'name',
+		BIODB.SYNONYMS,             'character',    BIODB.CARD.MANY,	'name',
+		BIODB.PROTEIN.DESCRIPTION,  'character',    BIODB.CARD.ONE,		'none',
+		BIODB.SYMBOL,               'character',    BIODB.CARD.ONE,		'none',
+		BIODB.GENE.SYMBOLS,         'character',    BIODB.CARD.MANY,	'none',
+		BIODB.NB.COMPOUNDS,         'integer',      BIODB.CARD.ONE,     'none',
+		BIODB.COMPOUNDS,            'object',       BIODB.CARD.MANY,  'none',
+		BIODB.CHEBI.ID,             'character',    BIODB.CARD.ONE,		'none',
+		BIODB.LIPIDMAPS.ID,         'character',    BIODB.CARD.ONE,		'none',
+		BIODB.KEGG.ID,              'character',    BIODB.CARD.ONE,		'none',
+		BIODB.HMDB.ID,              'character',    BIODB.CARD.ONE,		'none',
+		BIODB.ENZYME.ID,            'character',    BIODB.CARD.ONE,		'none',
+		BIODB.PUBCHEMCOMP.ID,       'character',    BIODB.CARD.ONE,		'none',
+		BIODB.PUBCHEMSUB.ID,        'character',    BIODB.CARD.ONE,		'none',
+		BIODB.PEAKFOREST.ID,        'character',    BIODB.CARD.ONE,		'none',
+		BIODB.UNIPROT.ID,           'character',    BIODB.CARD.ONE,		'none',
+		BIODB.NCBI.CCDS.ID,         'character',    BIODB.CARD.ONE,		'none',
+		BIODB.NCBI.GENE.ID,         'character',    BIODB.CARD.ONE,		'none',
+		BIODB.INCHI,                'character',    BIODB.CARD.ONE,		'none',
+		BIODB.INCHIKEY,             'character',    BIODB.CARD.ONE,		'none',
+		BIODB.MSDEV,                'character',    BIODB.CARD.ONE,		'none',
+		BIODB.MSDEVTYPE,            'character',    BIODB.CARD.ONE,		'none',
+		BIODB.MSTYPE,               'character',    BIODB.CARD.ONE,		'none',
+		BIODB.MSMODE,               'character',    BIODB.CARD.ONE,		'none',
+		BIODB.MSPRECMZ,             'double',       BIODB.CARD.ONE,		'none',
+		BIODB.PEAK.MZTHEO,			'double',		BIODB.CARD.ONE,		'none',
+		BIODB.MSPRECANNOT,          'character',    BIODB.CARD.ONE,		'none',
+		BIODB.FORMULA,              'character',    BIODB.CARD.ONE,		'none',
+		BIODB.SUPER.CLASS,          'character',    BIODB.CARD.ONE,		'none',
+		BIODB.MASS,                 'double',       BIODB.CARD.ONE,		'none',
+		BIODB.AVERAGE.MASS,         'double',       BIODB.CARD.ONE,		'none',
+		BIODB.MONOISOTOPIC.MASS,    'double',       BIODB.CARD.ONE,		'none',
+		BIODB.SEQUENCE,             'character',    BIODB.CARD.ONE,		'none',
+		BIODB.LENGTH,               'integer',      BIODB.CARD.ONE,		'none',
+		BIODB.LOCATION,             'character',    BIODB.CARD.ONE,		'none',
+		BIODB.NB.PEAKS,             'integer',      BIODB.CARD.ONE,		'none',
+		BIODB.PEAKS,                'data.frame',   BIODB.CARD.ONE,		'none',
+		BIODB.SMILES,               'character',    BIODB.CARD.ONE,		'none',
+		BIODB.CHEMSPIDER.ID,        'character',    BIODB.CARD.ONE,		'none',
+		BIODB.CAS.ID,               'character',    BIODB.CARD.ONE,		'none'
+		), byrow = TRUE, ncol = 4), stringsAsFactors = FALSE)
+	colnames(BIODB.FIELDS) <- c('name', 'class', 'cardinality', 'type')
+
+	#########################
+	# GET DATABASE ID FIELD #
+	#########################
+
+	biodb.get.database.id.field <- function(database) {
+
+		id.field <- NA_character_
+
+		if (database %in% BIODB.DATABASES) {
+			id.field <- paste0(database, 'id')
+			if ( ! id.field %in% BIODB.FIELDS[['name']])
+				stop(paste0('No ID field defined for database ', database, '.'))
+		}
+
+		return(id.field)
+	}
 
 	#####################
 	# COMPUTABLE FIELDS #
@@ -153,15 +232,6 @@
 	# PEAKS DATA FRAME #
 	####################
 
-	# Columns
-	BIODB.PEAK.MZ <- 'mz'
-	BIODB.PEAK.FORMULA <- 'formula'
-	BIODB.PEAK.FORMULA.COUNT <- 'formula.count'
-	BIODB.PEAK.MASS <- 'mass'
-	BIODB.PEAK.ERROR.PPM <- 'error.ppm'
-	BIODB.PEAK.INTENSITY <- 'intensity'
-	BIODB.PEAK.RELATIVE.INTENSITY <- 'relative.intensity'
-
 	# Example
 	BIODB.PEAK.DF.EXAMPLE <- data.frame(mz = double(), int = double(), rel.int = integer(), formula = character(), formula.count <- integer(), mass = double(), error = double(), stringsAsFactors = FALSE)
 	colnames(BIODB.PEAK.DF.EXAMPLE) <- c(BIODB.PEAK.MZ, BIODB.PEAK.INTENSITY, BIODB.PEAK.RELATIVE.INTENSITY, BIODB.PEAK.FORMULA, BIODB.PEAK.FORMULA.COUNT, BIODB.PEAK.MASS, BIODB.PEAK.ERROR.PPM)
@@ -171,55 +241,64 @@
 	#################
 
 	# TODO Let the choice to use either jp or eu
-	BIODB.MASSBANK.JP.WS.URL  <- "http://www.massbank.jp/api/services/MassBankAPI/getRecordInfo"
-	BIODB.MASSBANK.EU.WS.URL  <- "http://massbank.eu/api/services/MassBankAPI/getRecordInfo"
+	BIODB.MASSBANK.JP.WS.URL  <- "http://www.massbank.jp/api/services/MassBankAPI/"
+	BIODB.MASSBANK.EU.WS.URL  <- "http://massbank.eu/api/services/MassBankAPI/"
 
-	.do.get.entry.url <- function(class, accession, content.type = BIODB.ANY) {
+	.do.get.entry.url <- function(class, accession, content.type = BIODB.HTML, base.url = NA_character_, token = NA_character_) {
 
-		# TODO Only Massbank can handle multiple accession ids
-		if (class != 'massbank' && length(accession) > 1)
+		# Only certain databases can handle multiple accession ids
+		if ( ! class %in% c(BIODB.MASSBANK, BIODB.CHEMSPIDER, BIODB.PUBCHEMCOMP, BIODB.PUBCHEMSUB, BIODB.PEAKFOREST) && length(accession) > 1)
 			stop(paste0("Cannot build a URL for getting multiple entries for class ", class, "."))
 
+		# Get URL
 		url <- switch(class,
-			chebi       = if (content.type %in% c(BIODB.ANY, BIODB.HTML)) paste0('https://www.ebi.ac.uk/chebi/searchId.do?chebiId=', accession) else NULL,
-			chemspider  = if (content.type %in% c(BIODB.ANY, BIODB.HTML)) paste0('http://www.chemspider.com/Chemical-Structure.', accession, '.html') else NULL,
-			enzyme      = if (content.type %in% c(BIODB.ANY, BIODB.TXT)) paste0('http://enzyme.expasy.org/EC/', accession, '.txt') else NULL,
+			chebi       = if (content.type == BIODB.HTML) paste0('https://www.ebi.ac.uk/chebi/searchId.do?chebiId=', accession) else NULL,
+			chemspider  = {
+							token.param <- if (is.na(token)) '' else paste('&token', token, sep = '=')
+							switch(content.type,
+			                       html = paste0('http://www.chemspider.com/Chemical-Structure.', accession, '.html'),
+							       xml = paste0('http://www.chemspider.com/MassSpecAPI.asmx/GetExtendedCompoundInfoArray?', paste(paste0('CSIDs=', accession), collapse = '&'), token.param),
+		                           NULL)
+			},
+			enzyme      = if (content.type == BIODB.TXT) paste0('http://enzyme.expasy.org/EC/', accession, '.txt') else NULL,
 			hmdb        = switch(content.type,
 			                     xml = paste0('http://www.hmdb.ca/metabolites/', accession, '.xml'),
 			                     html = paste0('http://www.hmdb.ca/metabolites/', accession),
-			                     any = paste0('http://www.hmdb.ca/metabolites/', accession),
 			                     NULL),
 			kegg        = switch(content.type,
 			                     txt = paste0('http://rest.kegg.jp/get/', accession),
 			                     html = paste0('http://www.genome.jp/dbget-bin/www_bget?cpd:', accession),
-			                     any  = paste0('http://www.genome.jp/dbget-bin/www_bget?cpd:', accession),
+			                     NULL),
+			lipidmaps   = if (content.type == BIODB.CSV) paste0('http://www.lipidmaps.org/data/LMSDRecord.php?Mode=File&LMID=', accession, '&OutputType=CSV&OutputQuote=No') else NULL, 
+			massbank    = if (content.type == BIODB.TXT) paste0((if (is.na(base.url)) BIODB.MASSBANK.EU.WS.URL else base.url), 'getRecordInfo?ids=', paste(accession, collapse = ',')) else NULL,
+			mirbase     = if (content.type == BIODB.HTML) paste0('http://www.mirbase.org/cgi-bin/mature.pl?mature_acc=', accession) else NULL,
+			pubchemcomp = switch(content.type,
+			                     xml = paste0('https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/', paste(accession, collapse = ','), '/XML'),
+			                     html = paste0('http://pubchem.ncbi.nlm.nih.gov/compound/', accession),
 			                     NULL),
-			lipidmaps   = if (content.type %in% c(BIODB.ANY, BIODB.CSV)) paste0('http://www.lipidmaps.org/data/LMSDRecord.php?Mode=File&LMID=', accession, '&OutputType=CSV&OutputQuote=No') else NULL, 
-			massbank    = if (content.type %in% c(BIODB.ANY, BIODB.TXT)) paste0(BIODB.MASSBANK.EU.WS.URL, '?ids=', paste(accession, collapse = ',')) else NULL,
-			mirbase     = if (content.type %in% c(BIODB.ANY, BIODB.HTML)) paste0('http://www.mirbase.org/cgi-bin/mature.pl?mature_acc=', accession) else NULL,
-			pubchem     = {
-							accession <- gsub(' ', '', accession, perl = TRUE)
-							accession <- gsub('^CID', '', accession, perl = TRUE)
-							switch(content.type,
-			                     xml = paste0('http://pubchem.ncbi.nlm.nih.gov/rest/pug_view/data/compound/', accession, '/XML/?response_type=save&response_basename=CID_', accession),
-			                     html = paste0('http://pubchem.ncbi.nlm.nih.gov/compound/', accession),
-			                     NULL)
-		    			  },
-			ncbigene    = if (content.type %in% c(BIODB.ANY, BIODB.XML)) paste0('http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=gene&id=', accession, '&rettype=xml&retmode=text') else NULL,
-			ncbiccds    = if (content.type %in% c(BIODB.ANY, BIODB.HTML)) paste0('https://www.ncbi.nlm.nih.gov/CCDS/CcdsBrowse.cgi?REQUEST=CCDS&GO=MainBrowse&DATA=', accession),
-			uniprot     = if (content.type %in% c(BIODB.ANY, BIODB.XML)) paste0('http://www.uniprot.org/uniprot/', accession, '.xml'),
+			pubchemsub  = switch(content.type,
+			                     xml = paste0('https://pubchem.ncbi.nlm.nih.gov/rest/pug/substance/sid/', paste(accession, collapse = ','), '/XML'),
+			                     html = paste0('http://pubchem.ncbi.nlm.nih.gov/substance/', accession),
+			                     NULL),
+			ncbigene    = if (content.type == BIODB.XML) paste0('https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=gene&id=', accession, '&rettype=xml&retmode=text') else NULL,
+			ncbiccds    = if (content.type == BIODB.HTML) paste0('https://www.ncbi.nlm.nih.gov/CCDS/CcdsBrowse.cgi?REQUEST=CCDS&GO=MainBrowse&DATA=', accession),
+			uniprot     = if (content.type == BIODB.XML) paste0('http://www.uniprot.org/uniprot/', accession, '.xml'),
+			peakforest  = switch(content.type,
+			                     html= paste0('https://peakforest.org/home?PFs=',accession),
+			                     json= paste0('https://peakforest-alpha.inra.fr/rest/spectra/lcms/ids/',paste(accession,sep=','),'?token=',token),
+			                     
 			NULL
 			)
-
+		)
 		return(url)
 	}
 
-	get.entry.url <- function(class, accession, content.type = BIODB.ANY, max.length = 0) {
+	get.entry.url <- function(class, accession, content.type = BIODB.HTML, max.length = 0, base.url = NA_character_, token = NA_character_) {
 
 		if (length(accession) == 0)
 			return(NULL)
 
-		full.url <- .do.get.entry.url(class, accession, content.type = content.type)
+		full.url <- .do.get.entry.url(class, accession, content.type = content.type, base.url = base.url, token = token)
 		if (max.length == 0 || nchar(full.url) <= max.length)
 			return(if (max.length == 0) full.url else list(url = full.url, n = length(accession)))
 
@@ -228,13 +307,13 @@
 		b <- length(accession)
 		while (a < b) {
 			m <- as.integer((a + b) / 2)
-			url <- .do.get.entry.url(class, accession[1:m], content.type = content.type)
+			url <- .do.get.entry.url(class, accession[1:m], content.type = content.type, base.url = base.url, token = token)
 			if (nchar(url) <= max.length && m != a)
 				a <- m
 			else
 				b <- m
 		}
-		url <- .do.get.entry.url(class, accession[1:a], content.type = content.type)
+		url <- .do.get.entry.url(class, accession[1:a], content.type = content.type, base.url = base.url, token = token)
 			
 		return(list( url = url, n = a))
 	}
@@ -250,4 +329,22 @@
 		cat(paste0(BIODB.LEVEL.NAMES[[level]], if (is.na(class)) '' else paste0(", ", class), ": ", msg, "\n"), file = stderr())
 	}
 
+	#####################
+	# BIODB GET ENV VAR #
+	#####################
+
+	.biodb.get.env.var <- function(v) {
+
+		# Get all env vars
+		env <- Sys.getenv()
+
+		# Make env var name
+		env.var <- paste(c('BIODB', toupper(v)), collapse = '_')
+
+		# Look if this env var exists
+		if (env.var %in% names(env))
+			return(env[[env.var]])
+
+		return(NA_character_)
+	}
 }