seekia/resources/geneticReferences/polygenicDiseases/polygenicDiseases.go

111 lines
3.4 KiB
Go
Raw Permalink Normal View History

// polygenicDiseases provides information about polygenic diseases and the loci that influence them
package polygenicDiseases
// Polygenic diseases are different from monogenicDiseases
// Monogenic diseases are well understood to be caused by mutations in a single gene, and thus have more accurate risk probabilities.
// Polygenic disease probabilities are less accurate, because individual base pair changes only cause comparatively small changes in the disease risk.
// Polygenic diseases are also more influenced by environmental factors, further decreasing risk accuracy.
import "errors"
type PolygenicDisease struct{
DiseaseName string
DiseaseDescription string
// Is either "Mate"/"Female"/"Both"
EffectedSex string
// This is a list of rsIDs which are known to have an effect on this disease
// We use these loci to predict trait outcomes with neural networks.
// Map Structure: rsID -> (map[Reference Name]Reference Link)
LocusReferencesMap map[int64]map[string]string
// This is a list of all loci used to predict this disease's risk
// This should be a list of the keys in LocusReferencesMap
LociList []int64
// Inputs:
// -string: "Mate"/"Female"
// -int: Age
// Output:
// -float64: Average probability of having had the disease at that point in person's life
// -error
GetAverageRiskProbabilitiesFunction func(string, int)(float64, error)
// This map contains scientific resources about this disease
// Map Structure: Reference name -> Reference link
References map[string]string
}
var polygenicDiseaseNamesList []string
var polygenicDiseaseObjectsList []PolygenicDisease
// This must be called once during application startup
func InitializePolygenicDiseaseVariables()error{
breastCancerObject := getBreastCancerDiseaseObject()
autismObject := getAutismDiseaseObject()
obesityObject, err := getObesityDiseaseObject()
if (err != nil) { return err }
polygenicDiseaseObjectsList = []PolygenicDisease{breastCancerObject, autismObject, obesityObject}
polygenicDiseaseNamesList = make([]string, 0, len(polygenicDiseaseObjectsList))
for _, diseaseObject := range polygenicDiseaseObjectsList{
diseaseName := diseaseObject.DiseaseName
polygenicDiseaseNamesList = append(polygenicDiseaseNamesList, diseaseName)
}
return nil
}
// 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 GetPolygenicDiseaseNamesList()([]string, error){
if (polygenicDiseaseNamesList == nil){
return nil, errors.New("GetPolygenicDiseaseNamesList called when list is not initialized.")
}
return polygenicDiseaseNamesList, nil
}
func GetPolygenicDiseaseObjectsList()([]PolygenicDisease, error){
if (polygenicDiseaseObjectsList == nil){
return nil, errors.New("GetPolygenicDiseaseObjectsList called when list is not initialized.")
}
return polygenicDiseaseObjectsList, nil
}
func GetPolygenicDiseaseObject(diseaseName string)(PolygenicDisease, error){
polygenicDiseaseObjectsList, err := GetPolygenicDiseaseObjectsList()
if (err != nil) { return PolygenicDisease{}, err }
for _, diseaseObject := range polygenicDiseaseObjectsList{
currentDiseaseName := diseaseObject.DiseaseName
if (currentDiseaseName != diseaseName){
continue
}
return diseaseObject, nil
}
return PolygenicDisease{}, errors.New("GetPolygenicDiseaseObject called with unknown disease name: " + diseaseName)
}