533112afe2a2005e80cdb1f82904ea65032d4302 braney Sat Oct 2 11:37:34 2021 -0700 split hg/lib into two separate libaries, one only used by the cgis diff --git src/hg/lib/snp125Ui.c src/hg/lib/snp125Ui.c deleted file mode 100644 index 39af44f..0000000 --- src/hg/lib/snp125Ui.c +++ /dev/null @@ -1,719 +0,0 @@ -/* snp125Ui.c - enums & char arrays for snp UI features and shared util code */ - -/* Copyright (C) 2014 The Regents of the University of California - * See README in this or parent directory for licensing information. */ -#include "snp125Ui.h" -#include "snp125.h" -#include "common.h" -#include "soTerm.h" - - -char *snp125OrthoTable(struct trackDb *tdb, int *retSpeciesCount) -/* Look for a setting that specifies a table with orthologous alleles. - * If retSpeciesCount is not null, set it to the number of other species - * whose alleles are in the table. Do not free the returned string. */ -{ -char *table = trackDbSetting(tdb, "chimpMacaqueOrthoTable"); -int speciesCount = 2; -if (table == NULL) - { - table = trackDbSetting(tdb, "chimpOrangMacOrthoTable"); - speciesCount = 3; - } -if (retSpeciesCount != NULL) - *retSpeciesCount = speciesCount; -return table; -} - - -boolean snp125ExtendedNames = TRUE; - -/****** Some stuff for snp colors *******/ - -char *snp125ColorLabel[] = { - "red", - "green", - "blue", - "gray", - "black", -}; - -int snp125ColorArraySize = ArraySize(snp125ColorLabel); - - -/****** color source controls *******/ -/* This keeps track of which SNP feature is used for color definition. */ -/* Available SNP features: Molecule Type, Class, Validation, Function */ - -char *snp125ColorSourceLabels[] = { - "Location Type", - "Class", - "Validation", - "Function", - "Molecule Type", -}; - -char *snp125ColorSourceOldVar = "snp125ColorSource"; - -int snp125ColorSourceArraySize = ArraySize(snp125ColorSourceLabels); - -/* As of dbSNP 128, locType is ignored: */ -char *snp128ColorSourceLabels[] = { - "Class", - "Validation", - "Function", - "Molecule Type", -}; - -int snp128ColorSourceArraySize = ArraySize(snp128ColorSourceLabels); - -/* As of dbSNP 132, we have some new choices: */ -char *snp132ColorSourceLabels[] = { - "Class", - "Validation", - "Function", - "Molecule Type", - "Unusual Conditions (UCSC)", - "Miscellaneous Attributes (dbSNP)", - "Allele Frequencies", -}; - -int snp132ColorSourceArraySize = ArraySize(snp132ColorSourceLabels); - -/****** MolType related controls *******/ -/* Types: unknown, genomic, cDNA, [rarely] mito */ - -char *snp125MolTypeLabels[] = { - "Unknown", - "Genomic", - "cDNA", - "Mito" -}; -char *snp125MolTypeOldColorVars[] = { - "snp125MolTypeUnknown", - "snp125MolTypeGenomic", - "snp125MolTypecDNA", - "snp125MolTypeMito", -}; -char *snp125MolTypeDataName[] = { - "unknown", - "genomic", - "cDNA", - "mito" -}; -char *snp125MolTypeDefault[] = { - "red", - "black", - "blue", - "green" -}; -static char *snp125MolTypeOldIncludeVars[] = { - "snp125MolTypeUnknownInclude", - "snp125MolTypeGenomicInclude", - "snp125MolTypecDNAInclude", - "snp125MolTypeMitoInclude", -}; - -int snp125MolTypeArraySize = ArraySize(snp125MolTypeLabels); - -/****** Class related controls *******/ -/* Types: unknown, snp, in-del (locType exact), heterozygous, - microsatellite, named, no variation, mixed, mnp, - insertion (constructed from class = in-del, locType = between) - deletion (constructed from class = in-del, locType = range) */ - -char *snp125ClassLabels[] = { - "Unknown", - "Single Nucleotide Polymorphism", - "In/Del", - "Heterozygous", - "Microsatellite", - "Named", - "No Variation", - "Mixed", - "Mnp", - "Insertion", - "Deletion", -}; -char *snp125ClassOldColorVars[] = { - "snp125ClassUnknown", - "snp125ClassSingle", - "snp125ClassIn-del", - "snp125ClassHet", - "snp125ClassMicrosatellite", - "snp125ClassNamed", - "snp125ClassNoVar", - "snp125ClassMixed", - "snp125ClassMnp", - "snp125ClassInsertion", - "snp125ClassDeletion", -}; -char *snp125ClassDataName[] = { - "unknown", - "single", - "in-del", - "het", - "microsatellite", - "named", - "no variation", - "mixed", - "mnp", - "insertion", - "deletion", -}; -char *snp125ClassDefault[] = { - "red", // unknown - "black", // single - "black", // in-del - "black", // het - "blue", // microsatellite - "blue", // named - "black", // no variation - "green", // mixed - "green", // mnp - "black", // insertion - "red", // deletion -}; -static char *snp125ClassOldIncludeVars[] = { - "snp125ClassUnknownInclude", - "snp125ClassSingleInclude", - "snp125ClassIn-delInclude", - "snp125ClassHetInclude", - "snp125ClassMicrosatelliteInclude", - "snp125ClassNamedInclude", - "snp125ClassNoVarInclude", - "snp125ClassMixedInclude", - "snp125ClassMnpInclude", - "snp125ClassInsertionInclude", - "snp125ClassDeletionInclude", -}; - -int snp125ClassArraySize = ArraySize(snp125ClassLabels); - -/****** Validation related controls *******/ -/* Types: unknown, by-cluster, by-frequency, by-submitter, by-2hit-2allele, by-hapmap */ - -char *snp125ValidLabels[] = { - "Unknown", - "By Cluster", - "By Frequency", - "By Submitter", - "By 2 Hit / 2 Allele", - "By HapMap", - "By 1000 Genomes Project", -}; -char *snp125ValidOldColorVars[] = { - "snp125ValidUnknown", - "snp125ValidCluster", - "snp125ValidFrequency", - "snp125ValidSubmitter", - "snp125Valid2H2A", - "snp125ValidHapMap", - "snp125Valid1000Genomes", -}; -char *snp125ValidDataName[] = { - "unknown", - "by-cluster", - "by-frequency", - "by-submitter", - "by-2hit-2allele", - "by-hapmap", - "by-1000genomes", -}; -char *snp125ValidDefault[] = { - "red", - "black", - "black", - "black", - "black", - "green", - "blue", -}; -static char *snp125ValidOldIncludeVars[] = { - "snp125ValidUnknownInclude", - "snp125ValidClusterInclude", - "snp125ValidFrequencyInclude", - "snp125ValidSubmitterInclude", - "snp125Valid2H2AInclude", - "snp125ValidHapMapInclude", - "snp125Valid1000GenomesInclude", -}; - -int snp125ValidArraySizeHuman = ArraySize(snp125ValidLabels); -int snp125ValidArraySizeNonHuman = ArraySize(snp125ValidLabels) - 2; // No HapMap, 1000Genomes - -/****** function related controls *******/ -/* Values are a subset of snpNNN.func values: - * unknown, locus, coding, coding-synon, coding-nonsynon, - * untranslated, intron, splice-site, cds-reference */ - -char *snp125FuncLabels[] = { - "Unknown", - "Locus", - "Coding - Synonymous", - "Coding - Non-Synonymous", - "Untranslated", - "Intron", - "Splice Site", - "Reference (coding)", -}; -char *snp125FuncOldColorVars[] = { - "snp125FuncUnknown", - "snp125FuncLocus", - "snp125FuncSynon", - "snp125FuncNonSynon", - "snp125FuncUntranslated", - "snp125FuncIntron", - "snp125FuncSplice", - "snp125FuncReference", -}; -char *snp125FuncDataName[] = { - "unknown", - "locus", - "coding-synon", - "coding-nonsynon", - "untranslated", - "intron", - "splice-site", - "cds-reference", -}; -char *snp125FuncDefault[] = { - "black", // unknown - "black", // locus - "green", // coding-synon - "red", // coding-nonsynon - "blue", // untranslated - "black", // intron - "red", // splice-site - "black", // cds-reference -}; - -/* NCBI has added some new, more specific function types that map onto - * pre-existing simpler function classes. This mapping is an array of - * arrays, each of which has the simpler type (from snp125FuncDataName - * above) followed by more specific subtypes, if any. All arrays are - * NULL-terminated. */ -static char *locusSyn[] = - {"locus", "gene-segment", "near-gene-3", "near-gene-5", NULL}; -static char *nonsynonSyn[] = - {"coding-nonsynon", "nonsense", "missense", "frameshift", "stop-loss", "cds-indel", - "coding-synonymy-unknown", "cds-synonymy-unknown", NULL}; -static char *untranslatedSyn[] = - {"untranslated", "untranslated-3", "untranslated-5", NULL}; -static char *spliceSyn[] = - {"splice-site", "splice-3", "splice-5", NULL}; -static char *cdsRefSyn[] = - {"cds-reference", "coding", - NULL}; -char **snp125FuncDataSynonyms[] = { - locusSyn, - nonsynonSyn, - untranslatedSyn, - spliceSyn, - cdsRefSyn, - NULL -}; - -static char *snp125FuncOldIncludeVars[] = { - "snp125FuncUnknownInclude", - "snp125FuncLocusInclude", - "snp125FuncSynonInclude", - "snp125FuncNonSynonInclude", - "snp125FuncUntranslatedInclude", - "snp125FuncIntronInclude", - "snp125FuncSpliceInclude", - "snp125FuncReferenceInclude", -}; - -int snp125FuncArraySize = ArraySize(snp125FuncLabels); - -// Map func terms (from all snpNNN to date) to Sequence Ontology terms: -struct snpFuncSO - { - char *funcTerm; // term found in snpNNN.func - char *soTerm; // corresponding Sequence Ontology term - }; - -static struct snpFuncSO snpFuncToSO[] = { - { "locus", "feature_variant" }, - { "locus-region", "feature_variant" }, - { "coding", "coding_sequence_variant" }, - { "coding-synon", "synonymous_variant" }, - { "coding-nonsynon", "protein_altering_variant" }, - { "untranslated", "UTR_variant" }, - { "mrna-utr", "UTR_variant" }, - { "intron", "intron_variant" }, - { "splice-site", "splice_site_variant" }, - { "cds-reference", "coding_sequence_variant" }, - { "cds-synonymy-unknown", "coding_sequence_variant" }, - { "near-gene-3", "downstream_gene_variant" }, - { "near-gene-5", "upstream_gene_variant" }, - { "ncRNA", "nc_transcript_variant" }, - { "nonsense", "stop_gained" }, - { "missense", "missense_variant" }, - { "stop-loss", "stop_lost" }, - { "frameshift", "frameshift_variant" }, - { "cds-indel", "inframe_indel" }, - { "untranslated-3", "3_prime_UTR_variant" }, - { "untranslated-5", "5_prime_UTR_variant" }, - { "splice-3", "splice_acceptor_variant" }, - { "splice-5", "splice_donor_variant" }, - { NULL, NULL } -}; - -static char *snpSOFromFunc(char *funcTerm) -/* Look up snpNNN.func term in static array snpFuncToSO and return SO term if found, else NULL. */ -{ -if (isEmpty(funcTerm)) - return NULL; -int i; -for (i = 0; snpFuncToSO[i].funcTerm != NULL; i++) - { - if (sameString(funcTerm, snpFuncToSO[i].funcTerm)) - return snpFuncToSO[i].soTerm; - } -return NULL; -} - -#define MISO_BASE_URL "http://sequenceontology.org/browser/current_release/term/" - -char *snpMisoLinkFromFunc(char *funcTerm) -/* If we can map funcTerm to a Sequence Ontology term, return a link to the MISO SO browser; - * otherwise just return the same term. funcTerm may be a comma-separated list of terms. */ -{ -struct dyString *dy = dyStringNew(256); -char *terms[128]; -int termCount = chopCommas(cloneString(funcTerm), terms); -int i; -for (i = 0; i < termCount; i++) - { - if (i > 0) - dyStringAppend(dy, ", "); - char *soTerm = terms[i]; - int soId = soTermStringToId(soTerm); - if (soId < 0) - { - soTerm = snpSOFromFunc(terms[i]); - soId = soTermStringToId(soTerm); - } - if (soId >= 0) - dyStringPrintf(dy, "<A HREF=\""MISO_BASE_URL"SO:%07d\" TARGET=_BLANK>%s</A>", soId, soTerm); - else - dyStringAppend(dy, terms[i]); - } -return dyStringCannibalize(&dy); -} - -/****** LocType related controls *******/ -/* Types: unknown, range, exact, between, - rangeInsertion, rangeSubstitution, rangeDeletion */ - -char *snp125LocTypeLabels[] = { - "Unknown", - "Range", - "Exact", - "Between", - "RangeInsertion", - "RangeSubstitution", - "RangeDeletion", -}; -char *snp125LocTypeOldColorVars[] = { - "snp125LocTypeUnknown", - "snp125LocTypeRange", - "snp125LocTypeExact", - "snp125LocTypeBetween", - "snp125LocTypeRangeInsertion", - "snp125LocTypeRangeSubstitution", - "snp125LocTypeDeletion", -}; -char *snp125LocTypeDataName[] = { - "unknown", - "range", - "exact", - "between", - "rangeInsertion", - "rangeSubstitution", - "rangeDeletion", -}; -char *snp125LocTypeDefault[] = { - "black", - "red", - "black", - "blue", - "green", - "green", - "green", -}; -static char *snp125LocTypeOldIncludeVars[] = { - "snp125LocTypeUnknownInclude", - "snp125LocTypeRangeInclude", - "snp125LocTypeExactInclude", - "snp125LocTypeBetweenInclude", - "snp125LocTypeRangeInsertionInclude", - "snp125LocTypeRangeSubstitutionInclude", - "snp125LocTypeRangeDeletionInclude", -}; - -int snp125LocTypeArraySize = ArraySize(snp125LocTypeLabels); - -/****** Exception related controls *******/ -char *snp132ExceptionLabels[] = { - "None", - "RefAlleleMismatch", - "RefAlleleRevComp", - "DuplicateObserved", - "MixedObserved", - "FlankMismatchGenomeLonger", - "FlankMismatchGenomeEqual", - "FlankMismatchGenomeShorter", - "NamedDeletionZeroSpan", - "NamedInsertionNonzeroSpan", - "SingleClassLongerSpan", - "SingleClassZeroSpan", - "SingleClassTriAllelic", - "SingleClassQuadAllelic", - "ObservedWrongFormat", - "ObservedTooLong", - "ObservedContainsIupac", - "ObservedMismatch", - "MultipleAlignments", - "NonIntegerChromCount", - "AlleleFreqSumNot1", - "SingleAlleleFreq", - "InconsistentAlleles", -}; - -char *snp132ExceptionVarName[] = { - "NoExceptions", - "RefAlleleMismatch", - "RefAlleleRevComp", - "DuplicateObserved", - "MixedObserved", - "FlankMismatchGenomeLonger", - "FlankMismatchGenomeEqual", - "FlankMismatchGenomeShorter", - "NamedDeletionZeroSpan", - "NamedInsertionNonzeroSpan", - "SingleClassLongerSpan", - "SingleClassZeroSpan", - "SingleClassTriAllelic", - "SingleClassQuadAllelic", - "ObservedWrongFormat", - "ObservedTooLong", - "ObservedContainsIupac", - "ObservedMismatch", - "MultipleAlignments", - "NonIntegerChromCount", - "AlleleFreqSumNot1", - "SingleAlleleFreq", - "InconsistentAlleles", -}; - -char *snp132ExceptionDefault[] = { - "black", // NoExceptions - "red", // RefAlleleMismatch - "red", // RefAlleleRevComp - "red", // DuplicateObserved - "red", // MixedObserved - "red", // FlankMismatchGenomeLonger - "red", // FlankMismatchGenomeEqual - "red", // FlankMismatchGenomeShorter - "red", // NamedDeletionZeroSpan - "red", // NamedInsertionNonzeroSpan - "red", // SingleClassLongerSpan - "red", // SingleClassZeroSpan - "gray", // SingleClassTriAllelic - "gray", // SingleClassQuadAllelic - "red", // ObservedWrongFormat - "gray", // ObservedTooLong - "gray", // ObservedContainsIupac - "red", // ObservedMismatch - "red", // MultipleAlignments - "gray", // NonIntegerChromCount - "gray", // AlleleFreqSumNot1 - "gray", // SingleAlleleFreq - "gray", // InconsistentAlleles -}; - -int snp132ExceptionArraySize = ArraySize(snp132ExceptionLabels); - -/****** Miscellaneous attributes (dbSNP's bitfields) related controls *******/ - -char *snp132BitfieldLabels[] = { - "None", - "Clinically Associated", - "MAF >= 5% in Some Population", - "MAF >= 5% in All Populations", - "Appears in OMIM/OMIA", - "Has Microattribution/Third-Party Annotation", - "Submitted by Locus-Specific Database", - "Genotype Conflict", - "Ref SNP Cluster has Nonoverlapping Alleles", - "Some Assembly's Allele Does Not Match Observed", -}; - -char *snp132BitfieldVarName[] = { - "NoBitfields", - "ClinicallyAssoc", - "Maf5SomePop", - "Maf5AllPops", - "HasOmimOmia", - "MicroattrTpa", - "SubmittedByLsdb", - "GenotypeConflict", - "RsClusterNonoverlappingAlleles", - "DbSnpObservedMismatch", -}; - -char *snp132BitfieldDataName[] = { - "", - "clinically-assoc", - "maf-5-some-pop", - "maf-5-all-pops", - "has-omim-omia", - "microattr-tpa", - "submitted-by-lsdb", - "genotype-conflict", - "rs-cluster-nonoverlapping-alleles", - "observed-mismatch", -}; - -char *snp132BitfieldDefault[] = { - "black", // NoBitfields - "red", // ClinicallyAssoc - "blue", // Maf5SomePop - "green", // Maf5AllPops - "red", // HasOmimOmia - "red", // MicroattrTpa - "red", // SubmittedByLsdb - "gray", // GenotypeConflict - "gray", // RsClusterNonoverlappingAlleles - "gray", // DbSnpObservedMismatch -}; - -int snp132BitfieldArraySize = ArraySize(snp132BitfieldLabels); - - -struct slName *snp125FilterFromCart(struct cart *cart, char *track, char *attribute, - boolean *retFoundInCart) -/* Look up snp125 filter settings in the cart, keeping backwards compatibility with old - * cart variable names. */ -{ -struct slName *values = NULL; -boolean foundInCart = FALSE; -char cartVar[256]; -safef(cartVar, sizeof(cartVar), "%s.include_%s", track, attribute); -if (cartListVarExists(cart, cartVar)) - { - foundInCart = TRUE; - values = cartOptionalSlNameList(cart, cartVar); - } -else - { - char **oldVarNames = NULL, **oldDataName = NULL; - int oldArraySize = 0; - if (sameString(attribute, "molType")) - { - oldVarNames = snp125MolTypeOldIncludeVars; - oldDataName = snp125MolTypeDataName; - oldArraySize = snp125MolTypeArraySize; - } - else if (sameString(attribute, "class")) - { - oldVarNames = snp125ClassOldIncludeVars; - oldDataName = snp125ClassDataName; - oldArraySize = snp125ClassArraySize; - } - else if (sameString(attribute, "valid")) - { - oldVarNames = snp125ValidOldIncludeVars; - oldDataName = snp125ValidDataName; - oldArraySize = snp125ValidArraySizeHuman; - } - else if (sameString(attribute, "func")) - { - oldVarNames = snp125FuncOldIncludeVars; - oldDataName = snp125FuncDataName; - oldArraySize = snp125FuncArraySize; - } - else if (sameString(attribute, "locType")) - { - oldVarNames = snp125LocTypeOldIncludeVars; - oldDataName = snp125LocTypeDataName; - oldArraySize = snp125LocTypeArraySize; - } - if (oldVarNames != NULL) - { - int i; - for (i=0; i < oldArraySize; i++) - if (cartVarExists(cart, oldVarNames[i])) - { - foundInCart = TRUE; - break; - } - if (foundInCart) - { - for (i=0; i < oldArraySize; i++) - if (cartUsualBoolean(cart, oldVarNames[i], TRUE)) - slNameAddHead(&values, oldDataName[i]); - } - } - } -if (retFoundInCart != NULL) - *retFoundInCart = foundInCart; -return values; -} - -char *snp125OldColorVarToNew(char *oldVar, char *attribute) -/* Abbreviate an old cart var name -- new name is based on track plus this. Don't free result. */ -{ -char *ptr = oldVar; -if (startsWith("snp125", oldVar)) - { - ptr += strlen("snp125"); - char upCaseAttribute[256]; - safecpy(upCaseAttribute, sizeof(upCaseAttribute), attribute); - upCaseAttribute[0] = toupper(upCaseAttribute[0]); - if (startsWith(upCaseAttribute, ptr)) - ptr += strlen(upCaseAttribute); - } -return ptr; -} - -enum snp125ColorSource snp125ColorSourceFromCart(struct cart *cart, struct trackDb *tdb) -/* Look up color source in cart, keeping backwards compatibility with old cart var names. */ -{ -char cartVar[512]; -safef(cartVar, sizeof(cartVar), "%s.colorSource", tdb->track); -char *snp125ColorSourceDefault = snp125ColorSourceLabels[SNP125_DEFAULT_COLOR_SOURCE]; -char *colorSourceCart = cartUsualString(cart, cartVar, - cartUsualString(cart, snp125ColorSourceOldVar, - snp125ColorSourceDefault)); -int cs = stringArrayIx(colorSourceCart, snp125ColorSourceLabels, snp125ColorSourceArraySize); -int version = snpVersion(tdb->table); -if (version >= 132) - // The enum begins with locType, which is not in the array, so add 1 to enum: - cs = 1 + stringArrayIx(colorSourceCart, snp132ColorSourceLabels, snp132ColorSourceArraySize); -if (cs < 0) - cs = SNP125_DEFAULT_COLOR_SOURCE; -return (enum snp125ColorSource)cs; -} - -char *snp125ColorSourceToLabel(struct trackDb *tdb, enum snp125ColorSource cs) -/* Due to availability of different color sources in several different versions, - * this is not just an array lookup, hence the encapsulation. Don't modify return value. */ -{ -int version = snpVersion(tdb->table); -if (version >= 132) - { - if (cs < 1 || cs >= snp132ColorSourceArraySize+1) - errAbort("Bad color source for build 132 or later (%d)", cs); - return snp132ColorSourceLabels[cs-1]; - } -else - { - if (cs >= snp125ColorSourceArraySize) - errAbort("Bad color source for build 131 or earlier (%d)", cs); - return snp125ColorSourceLabels[cs]; - } -}