110 lines
3.4 KiB
Go
110 lines
3.4 KiB
Go
|
|
// 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)
|
|
}
|
|
|