seekia/resources/geneticReferences/monogenicDiseases/monogenicDiseases.go

154 lines
4.3 KiB
Go

// monogenicDiseases provides information about monogenic genetic diseases
package monogenicDiseases
import "errors"
// D == Deletion, I == Insertion
// All bases reference the DNA plus strand
// A disease variant is specific change on a specific location on the genome that causes the disease if mutated
type DiseaseVariant struct{
// 3 byte hex identifier. We must ensure no variants have the same identifier.
VariantIdentifier string
VariantNames []string
// Example: c.1657C>T
NucleotideChange string
// Example: Gly542Ter
AminoAcidChange string
// RSID that represents the location of this variant
// If multiple RSIDs represent the same variant location, use the first rsID for the locus in the locusMetadata package
VariantRSID int64
// Base which indicate allele does not have the disease (wild-type, reference, normal, functional)
HealthyBase string
// Base which mean allele tests positive for the disease (mutated)
DefectiveBase string
// Is true if the variant is known to have a mild effect
EffectIsMild bool
// Reference name -> Reference link
References map[string]string
}
type MonogenicDisease struct{
DiseaseName string
// Name of gene that if mutated causes disease
GeneName string
DominantOrRecessive string
DiseaseDescription string
VariantsList []DiseaseVariant
// Reference name -> Reference link
References map[string]string
}
var monogenicDiseaseNamesList []string
var monogenicDiseaseObjectsList []MonogenicDisease
// This must be called once during application startup
func InitializeMonogenicDiseaseVariables(){
cysticFibrosisObject := getCysticFibrosisDiseaseObject()
sickleCellAnemiaObject := getSickleCellAnemiaDiseaseObject()
monogenicDiseaseObjectsList = []MonogenicDisease{cysticFibrosisObject, sickleCellAnemiaObject}
monogenicDiseaseNamesList = make([]string, 0, len(monogenicDiseaseObjectsList))
for _, diseaseObject := range monogenicDiseaseObjectsList{
diseaseName := diseaseObject.DiseaseName
monogenicDiseaseNamesList = append(monogenicDiseaseNamesList, diseaseName)
}
}
// Be aware that all of these functions are returning original objects/slices, not copies
// Thus, we cannot edit the objects/slices that are returned. We must copy the fields first if we want to edit them.
func GetMonogenicDiseaseNamesList()([]string, error){
if (monogenicDiseaseNamesList == nil){
return nil, errors.New("GetMonogenicDiseaseNamesList called when list is not initialized.")
}
return monogenicDiseaseNamesList, nil
}
func GetMonogenicDiseaseObjectsList()([]MonogenicDisease, error){
if (monogenicDiseaseObjectsList == nil){
return nil, errors.New("GetMonogenicDiseaseObjectsList called when list is not initialized.")
}
return monogenicDiseaseObjectsList, nil
}
func GetMonogenicDiseaseObject(diseaseName string)(MonogenicDisease, error){
monogenicDiseasesList, err := GetMonogenicDiseaseObjectsList()
if (err != nil) { return MonogenicDisease{}, err }
for _, diseaseObject := range monogenicDiseasesList{
currentDiseaseName := diseaseObject.DiseaseName
if (currentDiseaseName == diseaseName){
return diseaseObject, nil
}
}
return MonogenicDisease{}, errors.New("GetMonogenicDiseaseObject called with unknown disease: " + diseaseName)
}
//Outputs:
// -map[string]DiseaseVariant: Variant Identifier -> Disease Variant
// -error
func GetMonogenicDiseaseVariantsMap(diseaseName string)(map[string]DiseaseVariant, error){
diseaseObject, err := GetMonogenicDiseaseObject(diseaseName)
if (err != nil){
return nil, errors.New("GetMonogenicDiseaseVariantsMap failed: " + err.Error())
}
diseaseVariantsMap := make(map[string]DiseaseVariant)
diseaseVariantsList := diseaseObject.VariantsList
for _, variantObject := range diseaseVariantsList{
variantIdentifier := variantObject.VariantIdentifier
diseaseVariantsMap[variantIdentifier] = variantObject
}
return diseaseVariantsMap, nil
}
func GetMonogenicDiseaseVariantObject(diseaseName string, variantIdentifier string)(DiseaseVariant, error){
diseaseVariantsMap, err := GetMonogenicDiseaseVariantsMap(diseaseName)
if (err != nil) { return DiseaseVariant{}, err }
variantObject, exists := diseaseVariantsMap[variantIdentifier]
if (exists == false) {
return DiseaseVariant{}, errors.New("GetMonogenicDiseaseVariantObject called with unknown variant. Disease: " + diseaseName + ", Variant: " + variantIdentifier)
}
return variantObject, nil
}