/* @include ensdatabaseentry **************************************************
**
** Ensembl Database Entry functions
**
** @author Copyright (C) 1999 Ensembl Developers
** @author Copyright (C) 2006 Michael K. Schuster
** @version $Revision: 1.30 $
** @modified 2009 by Alan Bleasby for incorporation into EMBOSS core
** @modified $Date: 2013/02/17 13:05:09 $ by $Author: mks $
** @@
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
** MA  02110-1301,  USA.
**
******************************************************************************/

#ifndef ENSDATABASEENTRY_H
#define ENSDATABASEENTRY_H

/* ========================================================================= */
/* ============================= include files ============================= */
/* ========================================================================= */

#include "ensanalysis.h"
#include "ensexternaldatabase.h"

AJ_BEGIN_DECLS




/* ========================================================================= */
/* =============================== constants =============================== */
/* ========================================================================= */

/* @enum EnsEOntologylinkageType **********************************************
**
** Ensembl Ontology Linkage Type enumeration
**
** @value ensEOntologylinkageTypeNULL
** Null
** @value ensEOntologylinkageTypeIC
** Inferred by Curator
** @value ensEOntologylinkageTypeIDA
** Inferred from Direct Assay
** @value ensEOntologylinkageTypeIEA
** Inferred from Electronic Annotation
** @value ensEOntologylinkageTypeIEP
** Inferred from Expression Pattern
** @value ensEOntologylinkageTypeIGI
** Inferred from Genetic Interaction
** @value ensEOntologylinkageTypeIMP
** Inferred from Mutant Phenotype
** @value ensEOntologylinkageTypeIPI
** Inferred from Physical Interaction
** @value ensEOntologylinkageTypeISS
** Inferred from Sequence or Structural Similarity
** @value ensEOntologylinkageTypeNAS
** Non-traceable Author Statement
** @value ensEOntologylinkageTypeND
** No biological Data available
** @value ensEOntologylinkageTypeTAS
** Traceable Author Statement
** @value ensEOntologylinkageTypeNR
** Not Recorded
** @value ensEOntologylinkageTypeRCA
** Inferred from Reviewed Computational Analysis
** @value ensEOntologylinkageTypeEXP
** Inferred from Experiment
** @value ensEOntologylinkageTypeISO
** Inferred from Sequence Orthology
** @value ensEOntologylinkageTypeISA
** Inferred from Sequence Alignment
** @value ensEOntologylinkageTypeISM
** Inferred from Sequence Model
** @value ensEOntologylinkageTypeIGC
** Inferred from Genomic Context
** @@
******************************************************************************/

typedef enum EnsOOntologylinkageType
{
    ensEOntologylinkageTypeNULL,
    ensEOntologylinkageTypeIC,
    ensEOntologylinkageTypeIDA,
    ensEOntologylinkageTypeIEA,
    ensEOntologylinkageTypeIEP,
    ensEOntologylinkageTypeIGI,
    ensEOntologylinkageTypeIMP,
    ensEOntologylinkageTypeIPI,
    ensEOntologylinkageTypeISS,
    ensEOntologylinkageTypeNAS,
    ensEOntologylinkageTypeND,
    ensEOntologylinkageTypeTAS,
    ensEOntologylinkageTypeNR,
    ensEOntologylinkageTypeRCA,
    ensEOntologylinkageTypeEXP,
    ensEOntologylinkageTypeISO,
    ensEOntologylinkageTypeISA,
    ensEOntologylinkageTypeISM,
    ensEOntologylinkageTypeIGC
} EnsEOntologylinkageType;




/* ========================================================================= */
/* ============================== public data ============================== */
/* ========================================================================= */




/* ========================================================================= */
/* =========================== public functions ============================ */
/* ========================================================================= */

/*
** Prototype definitions
*/

/* Ensembl External Reference */

EnsPExternalreference ensExternalreferenceNewCpy(
    const EnsPExternalreference er);

EnsPExternalreference ensExternalreferenceNewIni(
    ajuint identifier,
    EnsPAnalysis analysis,
    EnsPExternaldatabase edb,
    AjPStr primaryid,
    AjPStr displayid,
    AjPStr version,
    AjPStr description,
    AjPStr linkageannotation,
    AjPStr infotext,
    EnsEExternalreferenceInfotype erit,
    EnsEExternalreferenceObjecttype erot,
    ajuint objectid);

EnsPExternalreference ensExternalreferenceNewRef(
    EnsPExternalreference er);

void ensExternalreferenceDel(
    EnsPExternalreference *Per);

EnsPAnalysis ensExternalreferenceGetAnalysis(
    const EnsPExternalreference er);

AjPStr ensExternalreferenceGetDescription(
    const EnsPExternalreference er);

AjPStr ensExternalreferenceGetDisplayidentifier(
    const EnsPExternalreference er);

EnsPExternaldatabase ensExternalreferenceGetExternaldatabase(
    const EnsPExternalreference er);

ajuint ensExternalreferenceGetIdentifier(
    const EnsPExternalreference er);

AjPStr ensExternalreferenceGetInfotext(
    const EnsPExternalreference er);

EnsEExternalreferenceInfotype ensExternalreferenceGetInfotype(
    const EnsPExternalreference er);

AjPStr ensExternalreferenceGetLinkageannotation(
    const EnsPExternalreference er);

ajuint ensExternalreferenceGetObjectidentifier(
    const EnsPExternalreference er);

EnsEExternalreferenceObjecttype ensExternalreferenceGetObjecttype(
    const EnsPExternalreference er);

AjPStr ensExternalreferenceGetPrimaryidentifier(
    const EnsPExternalreference er);

AjPStr ensExternalreferenceGetVersion(
    const EnsPExternalreference er);

AjBool ensExternalreferenceSetAnalysis(EnsPExternalreference er,
                                       EnsPAnalysis analysis);

AjBool ensExternalreferenceSetDescription(EnsPExternalreference er,
                                          AjPStr description);

AjBool ensExternalreferenceSetDisplayidentifier(EnsPExternalreference er,
                                                AjPStr displayid);

AjBool ensExternalreferenceSetExternaldatabase(EnsPExternalreference er,
                                               EnsPExternaldatabase edb);

AjBool ensExternalreferenceSetIdentifier(EnsPExternalreference er,
                                         ajuint identifier);

AjBool ensExternalreferenceSetInfotext(EnsPExternalreference er,
                                       AjPStr infotext);

AjBool ensExternalreferenceSetInfotype(EnsPExternalreference er,
                                       EnsEExternalreferenceInfotype erit);

AjBool ensExternalreferenceSetLinkageannotation(EnsPExternalreference er,
                                                AjPStr linkageannotation);

AjBool ensExternalreferenceSetObjectidentifier(EnsPExternalreference er,
                                               ajuint objectid);

AjBool ensExternalreferenceSetObjecttype(EnsPExternalreference er,
                                         EnsEExternalreferenceObjecttype erot);

AjBool ensExternalreferenceSetPrimaryidentifier(EnsPExternalreference er,
                                                AjPStr primaryid);

AjBool ensExternalreferenceSetVersion(EnsPExternalreference er,
                                      AjPStr version);

AjBool ensExternalreferenceTrace(const EnsPExternalreference er, ajuint level);

size_t ensExternalreferenceCalculateMemsize(const EnsPExternalreference er);

EnsEExternalreferenceInfotype ensExternalreferenceInfotypeFromStr(
    const AjPStr infotype);

const char *ensExternalreferenceInfotypeToChar(
    EnsEExternalreferenceInfotype erit);

EnsEExternalreferenceObjecttype ensExternalreferenceObjecttypeFromStr(
    const AjPStr objecttype);

const char *ensExternalreferenceObjecttypeToChar(
    EnsEExternalreferenceObjecttype erot);

/* Ensembl Identity Reference */

EnsPIdentityreference ensIdentityreferenceNewCpy(
    const EnsPIdentityreference ir);

EnsPIdentityreference ensIdentityreferenceNewIni(AjPStr cigar,
                                                 ajint qstart,
                                                 ajint qend,
                                                 ajint qidentity,
                                                 ajint tstart,
                                                 ajint tend,
                                                 ajint tidentity,
                                                 double score,
                                                 double evalue);

EnsPIdentityreference ensIdentityreferenceNewRef(
    EnsPIdentityreference ir);

void ensIdentityreferenceDel(EnsPIdentityreference *Pir);

AjPStr ensIdentityreferenceGetCigar(const EnsPIdentityreference ir);

double ensIdentityreferenceGetEvalue(const EnsPIdentityreference ir);

ajint ensIdentityreferenceGetQueryEnd(const EnsPIdentityreference ir);

ajint ensIdentityreferenceGetQueryIdentity(const EnsPIdentityreference ir);

ajint ensIdentityreferenceGetQueryStart(const EnsPIdentityreference ir);

double ensIdentityreferenceGetScore(const EnsPIdentityreference ir);

ajint ensIdentityreferenceGetTargetEnd(const EnsPIdentityreference ir);

ajint ensIdentityreferenceGetTargetIdentity(const EnsPIdentityreference ir);

ajint ensIdentityreferenceGetTargetStart(const EnsPIdentityreference ir);

AjBool ensIdentityreferenceSetCigar(EnsPIdentityreference ir,
                                    AjPStr cigar);

AjBool ensIdentityreferenceSetEvalue(EnsPIdentityreference ir,
                                     double evalue);

AjBool ensIdentityreferenceSetQueryEnd(EnsPIdentityreference ir,
                                       ajint qend);

AjBool ensIdentityreferenceSetQueryIdentity(EnsPIdentityreference ir,
                                            ajint qidentity);

AjBool ensIdentityreferenceSetQueryStart(EnsPIdentityreference ir,
                                         ajint qstart);

AjBool ensIdentityreferenceSetScore(EnsPIdentityreference ir,
                                    double score);

AjBool ensIdentityreferenceSetTargetEnd(EnsPIdentityreference ir,
                                        ajint tend);

AjBool ensIdentityreferenceSetTargetIdentity(EnsPIdentityreference ir,
                                             ajint tidentity);

AjBool ensIdentityreferenceSetTargetStart(EnsPIdentityreference ir,
                                          ajint tstart);

AjBool ensIdentityreferenceTrace(const EnsPIdentityreference ir, ajuint level);

size_t ensIdentityreferenceCalculateMemsize(const EnsPIdentityreference ir);

/* Ensembl Ontology Linkage */

EnsPOntologylinkage ensOntologylinkageNewCpy(
    const EnsPOntologylinkage ol);

EnsPOntologylinkage ensOntologylinkageNewIni(
    AjPStr linkagetype,
    EnsPDatabaseentry source);

EnsPOntologylinkage ensOntologylinkageNewRef(
    EnsPOntologylinkage ol);

void ensOntologylinkageDel(EnsPOntologylinkage *Pol);

/* Ensembl Ontology Linkage Type */

EnsEOntologylinkageType ensOntologylinkageTypeFromStr(const AjPStr type);

const char *ensOntologylinkageTypeToChar(EnsEOntologylinkageType olt);

/* Ensembl Database Entry */

EnsPDatabaseentry ensDatabaseentryNewCpy(const EnsPDatabaseentry dbe);

EnsPDatabaseentry ensDatabaseentryNewIni(
    EnsPDatabaseentryadaptor dbea,
    ajuint identifier,
    EnsPAnalysis analysis,
    EnsPExternaldatabase edb,
    AjPStr primaryid,
    AjPStr displayid,
    AjPStr version,
    AjPStr description,
    AjPStr linkageannotation,
    AjPStr infotext,
    EnsEExternalreferenceInfotype erit,
    EnsEExternalreferenceObjecttype erot,
    ajuint objectid);

EnsPDatabaseentry ensDatabaseentryNewRef(EnsPDatabaseentry dbe);

void ensDatabaseentryDel(EnsPDatabaseentry *Pdbe);

EnsPDatabaseentryadaptor ensDatabaseentryGetAdaptor(
    const EnsPDatabaseentry dbe);

ajuint ensDatabaseentryGetIdentifier(
    const EnsPDatabaseentry dbe);

const AjPList ensDatabaseentryGetOntologylinkages(
    const EnsPDatabaseentry dbe);

AjPList ensDatabaseentryGetSynonyms(
    const EnsPDatabaseentry dbe);

AjBool ensDatabaseentryTrace(const EnsPDatabaseentry dbe, ajuint level);

size_t ensDatabaseentryCalculateMemsize(const EnsPDatabaseentry dbe);

AjPStr ensDatabaseentryGetDbDisplayname(
    const EnsPDatabaseentry dbe);

AjPStr ensDatabaseentryGetDbName(
    const EnsPDatabaseentry dbe);

AjPStr ensDatabaseentryGetDbRelease(
    const EnsPDatabaseentry dbe);

AjPStr ensDatabaseentryGetDescription(
    const EnsPDatabaseentry dbe);

AjPStr ensDatabaseentryGetDisplayidentifier(
    const EnsPDatabaseentry dbe);

AjPStr ensDatabaseentryGetInfotext(
    const EnsPDatabaseentry dbe);

EnsEExternalreferenceInfotype ensDatabaseentryGetInfotype(
    const EnsPDatabaseentry dbe);

AjPStr ensDatabaseentryGetLinkageannotation(
    const EnsPDatabaseentry dbe);

ajuint ensDatabaseentryGetObjectidentifier(
    const EnsPDatabaseentry dbe);

EnsEExternalreferenceObjecttype ensDatabaseentryGetObjecttype(
    const EnsPDatabaseentry dbe);

AjPStr ensDatabaseentryGetPrimaryidentifier(
    const EnsPDatabaseentry dbe);

ajint ensDatabaseentryGetPriority(
    const EnsPDatabaseentry dbe);

EnsEExternaldatabaseStatus ensDatabaseentryGetStatus(
    const EnsPDatabaseentry dbe);

EnsEExternaldatabaseType ensDatabaseentryGetType(
    const EnsPDatabaseentry dbe);

AjPStr ensDatabaseentryGetVersion(
    const EnsPDatabaseentry dbe);

AjBool ensDatabaseentryAddOntologylinkage(EnsPDatabaseentry dbe,
                                          AjPStr linkagetype,
                                          EnsPDatabaseentry source);

AjBool ensDatabaseentryClearOntologylinkages(EnsPDatabaseentry dbe);

AjBool ensDatabaseentryFetchAllDependents(
    EnsPDatabaseentry dbe,
    AjPList dbes);

AjBool ensDatabaseentryFetchAllDependentsByGene(
    EnsPDatabaseentry dbe,
    const EnsPGene gene,
    AjPList dbes);

AjBool ensDatabaseentryFetchAllDependentsByTranscript(
    EnsPDatabaseentry dbe,
    const EnsPTranscript transcript,
    AjPList dbes);

AjBool ensDatabaseentryFetchAllDependentsByTranslation(
    EnsPDatabaseentry dbe,
    const EnsPTranslation translation,
    AjPList dbes);

AjBool ensDatabaseentryFetchAllLinkagetypes(const EnsPDatabaseentry dbe,
                                            AjPList types);

AjBool ensDatabaseentryFetchAllMasters(
    EnsPDatabaseentry dbe,
    AjPList dbes);

AjBool ensDatabaseentryFetchAllMastersByGene(
    EnsPDatabaseentry dbe,
    const EnsPGene gene,
    AjPList dbes);

AjBool ensDatabaseentryFetchAllMastersByTranscript(
    EnsPDatabaseentry dbe,
    const EnsPTranscript transcript,
    AjPList dbes);

AjBool ensDatabaseentryFetchAllMastersByTranslation(
    EnsPDatabaseentry dbe,
    const EnsPTranslation translation,
    AjPList dbes);

/* Ensembl Database Entry Adaptor */

EnsPDatabaseentryadaptor ensRegistryGetDatabaseentryadaptor(
    EnsPDatabaseadaptor dba);

EnsPDatabaseadaptor ensDatabaseentryadaptorGetDatabaseadaptor(
    EnsPDatabaseentryadaptor dbea);

AjBool ensDatabaseentryadaptorFetchAllDependents(
    EnsPDatabaseentryadaptor dbea,
    const EnsPDatabaseentry dbe,
    AjPList dbes);

AjBool ensDatabaseentryadaptorFetchAllDependentsByGene(
    EnsPDatabaseentryadaptor dbea,
    const EnsPDatabaseentry dbe,
    const EnsPGene gene,
    AjPList dbes);

AjBool ensDatabaseentryadaptorFetchAllDependentsByTranscript(
    EnsPDatabaseentryadaptor dbea,
    const EnsPDatabaseentry dbe,
    const EnsPTranscript transcript,
    AjPList dbes);

AjBool ensDatabaseentryadaptorFetchAllDependentsByTranslation(
    EnsPDatabaseentryadaptor dbea,
    const EnsPDatabaseentry dbe,
    const EnsPTranslation translation,
    AjPList dbes);

AjBool ensDatabaseentryadaptorFetchAllMasters(
    EnsPDatabaseentryadaptor dbea,
    const EnsPDatabaseentry dbe,
    AjPList dbes);

AjBool ensDatabaseentryadaptorFetchAllMastersByGene(
    EnsPDatabaseentryadaptor dbea,
    const EnsPDatabaseentry dbe,
    const EnsPGene gene,
    AjPList dbes);

AjBool ensDatabaseentryadaptorFetchAllMastersByTranscript(
    EnsPDatabaseentryadaptor dbea,
    const EnsPDatabaseentry dbe,
    const EnsPTranscript transcript,
    AjPList dbes);

AjBool ensDatabaseentryadaptorFetchAllMastersByTranslation(
    EnsPDatabaseentryadaptor dbea,
    const EnsPDatabaseentry dbe,
    const EnsPTranslation translation,
    AjPList dbes);

AjBool ensDatabaseentryadaptorFetchAllbyDescription(
    EnsPDatabaseentryadaptor dbea,
    const AjPStr description,
    const AjPStr dbname,
    AjPList dbes);

AjBool ensDatabaseentryadaptorFetchAllbyGene(
    EnsPDatabaseentryadaptor dbea,
    const EnsPGene gene,
    const AjPStr dbname,
    EnsEExternaldatabaseType dbtype,
    AjPList dbes);

AjBool ensDatabaseentryadaptorFetchAllbyName(
    EnsPDatabaseentryadaptor dbea,
    const AjPStr name,
    const AjPStr dbname,
    AjPList dbes);

AjBool ensDatabaseentryadaptorFetchAllbyObject(
    EnsPDatabaseentryadaptor dbea,
    ajuint objectidentifier,
    const AjPStr objecttype,
    const AjPStr dbname,
    EnsEExternaldatabaseType dbtype,
    AjPList dbes);

AjBool ensDatabaseentryadaptorFetchAllbySource(
    EnsPDatabaseentryadaptor dbea,
    const AjPStr source,
    AjPList dbes);

AjBool ensDatabaseentryadaptorFetchAllbyTranscript(
    EnsPDatabaseentryadaptor dbea,
    const EnsPTranscript transcript,
    const AjPStr dbname,
    EnsEExternaldatabaseType dbtype,
    AjPList dbes);

AjBool ensDatabaseentryadaptorFetchAllbyTranslation(
    EnsPDatabaseentryadaptor dbea,
    const EnsPTranslation translation,
    const AjPStr dbname,
    EnsEExternaldatabaseType dbtype,
    AjPList dbes);

AjBool ensDatabaseentryadaptorFetchByAccession(
    EnsPDatabaseentryadaptor dbea,
    const AjPStr dbname,
    const AjPStr accession,
    EnsPDatabaseentry *Pdbe);

AjBool ensDatabaseentryadaptorFetchByIdentifier(
    EnsPDatabaseentryadaptor dbea,
    ajuint identifier,
    EnsPDatabaseentry *Pdbe);

AjBool ensDatabaseentryadaptorRetrieveAllGeneidentifiersByExternaldatabasename(
    EnsPDatabaseentryadaptor dbea,
    const AjPStr dbname,
    AjPTable identifiers);

AjBool ensDatabaseentryadaptorRetrieveAllGeneidentifiersByExternalname(
    EnsPDatabaseentryadaptor dbea,
    const AjPStr name,
    const AjPStr dbname,
    AjBool override,
    AjPTable identifiers);

AjBool ensDatabaseentryadaptorRetrieveAllTranscriptidentifiersByExternaldatabasename(
    EnsPDatabaseentryadaptor dbea,
    const AjPStr dbname,
    AjPTable identifiers);

AjBool ensDatabaseentryadaptorRetrieveAllTranscriptidentifiersByExternalname(
    EnsPDatabaseentryadaptor dbea,
    const AjPStr name,
    const AjPStr dbname,
    AjBool override,
    AjPTable identifiers);

AjBool ensDatabaseentryadaptorRetrieveAllTranslationidentifiersByExternaldatabasename(
    EnsPDatabaseentryadaptor dbea,
    const AjPStr dbname,
    AjPTable identifiers);

AjBool ensDatabaseentryadaptorRetrieveAllTranslationidentifiersByExternalname(
    EnsPDatabaseentryadaptor dbea,
    const AjPStr name,
    const AjPStr dbname,
    AjBool override,
    AjPTable identifiers);

/*
** End of prototype definitions
*/




AJ_END_DECLS

#endif /* !ENSDATABASEENTRY_H */
