154 lines
4.3 KiB
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
|
|
}
|
|
|
|
|