Created the GetUserGenomeLocusValuesMapFromProfile function and used it to remove some duplicated code.

This commit is contained in:
Simon Sarasova 2024-08-14 11:25:25 +00:00
parent b6f5612bbc
commit 39c4edbe2f
No known key found for this signature in database
GPG key ID: EEDA4103C9C36944
4 changed files with 21 additions and 252 deletions

View file

@ -6,6 +6,7 @@ Small and insignificant changes may not be included in this log.
## Unversioned Changes
* Created the GetUserGenomeLocusValuesMapFromProfile function and used it to remove some duplicated code. - *Simon Sarasova*
* Added new genetic attributes to the calculatedAttributes package. Added the ability to view and sort by these attributes in the GUI. - *Simon Sarasova*
* Upgraded Golang to version 1.23. - *Simon Sarasova*
* Added the Obesity disease to genetic analyses. - *Simon Sarasova*

View file

@ -9,4 +9,4 @@ Many other people have written code for modules which are imported by Seekia. Th
Name | Date Of First Commit | Number Of Commits
--- | --- | ---
Simon Sarasova | June 13, 2023 | 281
Simon Sarasova | June 13, 2023 | 282

View file

@ -3033,45 +3033,8 @@ func setViewMateProfilePage_PolygenicDiseases(window fyne.Window, userOrOffsprin
diseaseNameLabel := getBoldLabelCentered(diseaseName)
// Map Structure: Locus rsID -> Locus Value
userDiseaseLocusValuesMap := make(map[int64]locusValue.LocusValue)
for _, locusRSID := range diseaseLociList{
locusRSIDString := helpers.ConvertInt64ToString(locusRSID)
locusValueAttributeName := "LocusValue_rs" + locusRSIDString
userLocusValueExists, _, userLocusValue, err := getAnyUserProfileAttributeFunction(locusValueAttributeName)
if (err != nil) { return nil, err }
if (userLocusValueExists == false){
continue
}
userLocusBase1, userLocusBase2, semicolonFound := strings.Cut(userLocusValue, ";")
if (semicolonFound == false){
return nil, errors.New("Database corrupt: Contains profile with invalid " + locusValueAttributeName + " value: " + userLocusValue)
}
userLocusIsPhasedAttributeName := "LocusIsPhased_rs" + locusRSIDString
userLocusIsPhasedExists, _, userLocusIsPhasedString, err := getAnyUserProfileAttributeFunction(userLocusIsPhasedAttributeName)
if (err != nil) { return nil, err }
if (userLocusIsPhasedExists == false){
return nil, errors.New("Database corrupt: Contains profile with locusValue but not locusIsPhased status for locus: " + locusRSIDString)
}
userLocusIsPhased, err := helpers.ConvertYesOrNoStringToBool(userLocusIsPhasedString)
if (err != nil) { return nil, err }
userLocusValueObject := locusValue.LocusValue{
Base1Value: userLocusBase1,
Base2Value: userLocusBase2,
LocusIsPhased: userLocusIsPhased,
}
userDiseaseLocusValuesMap[locusRSID] = userLocusValueObject
}
userDiseaseLocusValuesMap, err := calculatedAttributes.GetUserGenomeLocusValuesMapFromProfile(diseaseLociList, getAnyUserProfileAttributeFunction)
if (err != nil) { return nil, err }
if (userOrOffspring == "User"){
@ -3372,45 +3335,9 @@ func setViewMateProfilePage_DiscreteGeneticTraits(window fyne.Window, userOrOffs
viewTraitDetailsButtonsColumn.Add(viewTraitDetailsButton)
// We construct the user's trait locus values map
// Map Structure: Locus rsID -> locusValue.LocusValue
userTraitLocusValuesMap := make(map[int64]locusValue.LocusValue)
for _, rsID := range traitLociList{
rsIDString := helpers.ConvertInt64ToString(rsID)
userLocusValueAttributeName := "LocusValue_rs" + rsIDString
userLocusValueIsKnown, _, userLocusValue, err := getAnyUserProfileAttributeFunction(userLocusValueAttributeName)
if (err != nil) { return nil, err }
if (userLocusValueIsKnown == false){
continue
}
userLocusBase1, userLocusBase2, semicolonFound := strings.Cut(userLocusValue, ";")
if (semicolonFound == false){
return nil, errors.New("Database corrupt: Contains profile with invalid " + userLocusValueAttributeName + " value: " + userLocusValue)
}
userLocusIsPhasedAttributeName := "LocusIsPhased_rs" + rsIDString
userLocusIsPhasedExists, _, userLocusIsPhasedString, err := getAnyUserProfileAttributeFunction(userLocusIsPhasedAttributeName)
if (err != nil) { return nil, err }
if (userLocusIsPhasedExists == false){
return nil, errors.New("Database corrupt: Contains profile with locusValue but not locusIsPhased status for locus: " + rsIDString)
}
userLocusIsPhased, err := helpers.ConvertYesOrNoStringToBool(userLocusIsPhasedString)
if (err != nil) { return nil, err }
userLocusValueObject := locusValue.LocusValue{
Base1Value: userLocusBase1,
Base2Value: userLocusBase2,
LocusIsPhased: userLocusIsPhased,
}
userTraitLocusValuesMap[rsID] = userLocusValueObject
}
userTraitLocusValuesMap, err := calculatedAttributes.GetUserGenomeLocusValuesMapFromProfile(traitLociList, getAnyUserProfileAttributeFunction)
if (err != nil) { return nil, err }
if (userOrOffspring == "User"){
@ -3737,45 +3664,10 @@ func setViewMateProfilePage_DiscreteTraitRules(window fyne.Window, traitName str
getUserTraitLocusValuesMap := func()(bool, map[int64]locusValue.LocusValue, error){
// We construct the user's trait locus values map
// Map Structure: Locus rsID -> locusValue.LocusValue
userTraitLocusValuesMap := make(map[int64]locusValue.LocusValue)
for _, rsID := range traitLociList_Rules{
userTraitLocusValuesMap, err := calculatedAttributes.GetUserGenomeLocusValuesMapFromProfile(traitLociList_Rules, getAnyUserProfileAttributeFunction)
if (err != nil) { return false, nil, err }
rsIDString := helpers.ConvertInt64ToString(rsID)
userLocusValueAttributeName := "LocusValue_rs" + rsIDString
userLocusValueIsKnown, _, userLocusValue, err := getAnyUserProfileAttributeFunction(userLocusValueAttributeName)
if (err != nil) { return false, nil, err }
if (userLocusValueIsKnown == false){
continue
}
userLocusBase1, userLocusBase2, semicolonFound := strings.Cut(userLocusValue, ";")
if (semicolonFound == false){
return false, nil, errors.New("Database corrupt: Contains profile with invalid " + userLocusValueAttributeName + " value: " + userLocusValue)
}
userLocusIsPhasedAttributeName := "LocusIsPhased_rs" + rsIDString
userLocusIsPhasedExists, _, userLocusIsPhasedString, err := getAnyUserProfileAttributeFunction(userLocusIsPhasedAttributeName)
if (err != nil) { return false, nil, err }
if (userLocusIsPhasedExists == false){
return false, nil, errors.New("Database corrupt: Contains profile with locusValue but not locusIsPhased status for locus: " + rsIDString)
}
userLocusIsPhased, err := helpers.ConvertYesOrNoStringToBool(userLocusIsPhasedString)
if (err != nil) { return false, nil, err }
userLocusValueObject := locusValue.LocusValue{
Base1Value: userLocusBase1,
Base2Value: userLocusBase2,
LocusIsPhased: userLocusIsPhased,
}
userTraitLocusValuesMap[rsID] = userLocusValueObject
}
if (len(userTraitLocusValuesMap) == 0){
return false, nil, nil
}
@ -4235,45 +4127,9 @@ func setViewMateProfilePage_NumericGeneticTraits(window fyne.Window, userOrOffsp
traitNameText := getBoldLabelCentered(translate(traitName))
// We construct the user's trait locus values map
// Map Structure: Locus rsID -> locusValue.LocusValue
userTraitLocusValuesMap := make(map[int64]locusValue.LocusValue)
for _, rsID := range traitLociList{
rsIDString := helpers.ConvertInt64ToString(rsID)
userLocusValueAttributeName := "LocusValue_rs" + rsIDString
userLocusValueIsKnown, _, userLocusValue, err := getAnyUserProfileAttributeFunction(userLocusValueAttributeName)
if (err != nil) { return nil, err }
if (userLocusValueIsKnown == false){
continue
}
userLocusBase1, userLocusBase2, semicolonFound := strings.Cut(userLocusValue, ";")
if (semicolonFound == false){
return nil, errors.New("Database corrupt: Contains profile with invalid " + userLocusValueAttributeName + " value: " + userLocusValue)
}
userLocusIsPhasedAttributeName := "LocusIsPhased_rs" + rsIDString
userLocusIsPhasedExists, _, userLocusIsPhasedString, err := getAnyUserProfileAttributeFunction(userLocusIsPhasedAttributeName)
if (err != nil) { return nil, err }
if (userLocusIsPhasedExists == false){
return nil, errors.New("Database corrupt: Contains profile with locusValue but not locusIsPhased status for locus: " + rsIDString)
}
userLocusIsPhased, err := helpers.ConvertYesOrNoStringToBool(userLocusIsPhasedString)
if (err != nil) { return nil, err }
userLocusValueObject := locusValue.LocusValue{
Base1Value: userLocusBase1,
Base2Value: userLocusBase2,
LocusIsPhased: userLocusIsPhased,
}
userTraitLocusValuesMap[rsID] = userLocusValueObject
}
userTraitLocusValuesMap, err := calculatedAttributes.GetUserGenomeLocusValuesMapFromProfile(traitLociList, getAnyUserProfileAttributeFunction)
if (err != nil) { return nil, err }
getPredictedOutcomeLabel := func(analysisExists bool, predictedOutcome float64)(fyne.Widget, error){

View file

@ -707,56 +707,12 @@ func GetAnyProfileAttributeIncludingCalculated(attributeName string, getProfileA
// Each risk score is a number between 0 and 1
allDiseasesAverageRiskScoreNumerator := float64(0)
// Map Structure: Locus rsID -> Locus Value
userDiseaseLocusValuesMap := make(map[int64]locusValue.LocusValue)
for _, diseaseObject := range polygenicDiseaseObjectsList{
diseaseLociList := diseaseObject.LociList
for _, locusRSID := range diseaseLociList{
_, exists := userDiseaseLocusValuesMap[locusRSID]
if (exists == true){
// We already added this locus
// This can happen if two diseases share the same locus
continue
}
locusRSIDString := helpers.ConvertInt64ToString(locusRSID)
locusValueAttributeName := "LocusValue_rs" + locusRSIDString
userLocusValueExists, _, userLocusValue, err := getProfileAttributesFunction(locusValueAttributeName)
if (err != nil) { return false, 0, "", err }
if (userLocusValueExists == false){
continue
}
userLocusBase1, userLocusBase2, semicolonFound := strings.Cut(userLocusValue, ";")
if (semicolonFound == false){
return false, 0, "", errors.New("Database corrupt: Contains profile with invalid " + locusValueAttributeName + " value: " + userLocusValue)
}
userLocusIsPhasedAttributeName := "LocusIsPhased_rs" + locusRSIDString
userLocusIsPhasedExists, _, userLocusIsPhasedString, err := getProfileAttributesFunction(userLocusIsPhasedAttributeName)
if (err != nil) { return false, 0, "", err }
if (userLocusIsPhasedExists == false){
return false, 0, "", errors.New("Database corrupt: Contains profile with locusValue but not locusIsPhased status for locus: " + locusRSIDString)
}
userLocusIsPhased, err := helpers.ConvertYesOrNoStringToBool(userLocusIsPhasedString)
if (err != nil) { return false, 0, "", err }
userLocusValueObject := locusValue.LocusValue{
Base1Value: userLocusBase1,
Base2Value: userLocusBase2,
LocusIsPhased: userLocusIsPhased,
}
userDiseaseLocusValuesMap[locusRSID] = userLocusValueObject
}
userDiseaseLocusValuesMap, err := GetUserGenomeLocusValuesMapFromProfile(diseaseLociList, getProfileAttributesFunction)
if (err != nil) { return false, 0, "", err }
neuralNetworkExists, anyLocusTested, userDiseaseRiskScore, _, _, _, err := createPersonGeneticAnalysis.GetPersonGenomePolygenicDiseaseAnalysis(diseaseObject, userDiseaseLocusValuesMap, true)
if (err != nil) { return false, 0, "", err }
@ -828,56 +784,12 @@ func GetAnyProfileAttributeIncludingCalculated(attributeName string, getProfileA
// Each risk score is a number between 0 and 1
allDiseasesAverageRiskScoreNumerator := float64(0)
// Map Structure: rsID -> Locus Value
userDiseaseLocusValuesMap := make(map[int64]locusValue.LocusValue)
for _, diseaseObject := range polygenicDiseaseObjectsList{
diseaseLociList := diseaseObject.LociList
for _, locusRSID := range diseaseLociList{
_, exists := userDiseaseLocusValuesMap[locusRSID]
if (exists == true){
// We already added this locus
// This can happen if two diseases share the same locus
continue
}
locusRSIDString := helpers.ConvertInt64ToString(locusRSID)
locusValueAttributeName := "LocusValue_rs" + locusRSIDString
userLocusValueExists, _, userLocusValue, err := getProfileAttributesFunction(locusValueAttributeName)
if (err != nil) { return false, 0, "", err }
if (userLocusValueExists == false){
continue
}
userLocusBase1, userLocusBase2, semicolonFound := strings.Cut(userLocusValue, ";")
if (semicolonFound == false){
return false, 0, "", errors.New("GetAnyProfileAttributeIncludingCalculated called with profile containing invalid " + locusValueAttributeName + ": " + userLocusValue)
}
userLocusIsPhasedAttributeName := "LocusIsPhased_rs" + locusRSIDString
userLocusIsPhasedExists, _, userLocusIsPhasedString, err := getProfileAttributesFunction(userLocusIsPhasedAttributeName)
if (err != nil) { return false, 0, "", err }
if (userLocusIsPhasedExists == false){
return false, 0, "", errors.New("Database corrupt: Contains profile with locusValue but not locusIsPhased status for locus: " + locusRSIDString)
}
userLocusIsPhased, err := helpers.ConvertYesOrNoStringToBool(userLocusIsPhasedString)
if (err != nil) { return false, 0, "", err }
newLocusValueObject := locusValue.LocusValue{
Base1Value: userLocusBase1,
Base2Value: userLocusBase2,
LocusIsPhased: userLocusIsPhased,
}
userDiseaseLocusValuesMap[locusRSID] = newLocusValueObject
}
userDiseaseLocusValuesMap, err := GetUserGenomeLocusValuesMapFromProfile(diseaseLociList, getProfileAttributesFunction)
if (err != nil) { return false, 0, "", err }
neuralNetworkExists, anyLocusValuesTested, offspringAverageRiskScore, _, _, _, _, err := createCoupleGeneticAnalysis.GetOffspringPolygenicDiseaseAnalysis(diseaseObject, myGenomeLocusValuesMap, userDiseaseLocusValuesMap)
if (err != nil) { return false, 0, "", err }
@ -921,7 +833,7 @@ func GetAnyProfileAttributeIncludingCalculated(attributeName string, getProfileA
diseaseLociList := diseaseObject.LociList
userDiseaseLocusValuesMap, err := getUserGenomeLocusValuesMap(diseaseLociList, getProfileAttributesFunction)
userDiseaseLocusValuesMap, err := GetUserGenomeLocusValuesMapFromProfile(diseaseLociList, getProfileAttributesFunction)
if (err != nil) { return false, 0, "", err }
neuralNetworkExists, anyLocusTested, userDiseaseRiskScore, _, _, _, err := createPersonGeneticAnalysis.GetPersonGenomePolygenicDiseaseAnalysis(diseaseObject, userDiseaseLocusValuesMap, true)
@ -972,7 +884,7 @@ func GetAnyProfileAttributeIncludingCalculated(attributeName string, getProfileA
diseaseLociList := diseaseObject.LociList
userDiseaseLocusValuesMap, err := getUserGenomeLocusValuesMap(diseaseLociList, getProfileAttributesFunction)
userDiseaseLocusValuesMap, err := GetUserGenomeLocusValuesMapFromProfile(diseaseLociList, getProfileAttributesFunction)
if (err != nil) { return false, 0, "", err }
neuralNetworkExists, anyLocusValuesTested, offspringAverageRiskScore, _, _, _, _, err := createCoupleGeneticAnalysis.GetOffspringPolygenicDiseaseAnalysis(diseaseObject, myGenomeLocusValuesMap, userDiseaseLocusValuesMap)
@ -1021,7 +933,7 @@ func GetAnyProfileAttributeIncludingCalculated(attributeName string, getProfileA
traitLociList := traitObject.LociList
userTraitLocusValuesMap, err := getUserGenomeLocusValuesMap(traitLociList, getProfileAttributesFunction)
userTraitLocusValuesMap, err := GetUserGenomeLocusValuesMapFromProfile(traitLociList, getProfileAttributesFunction)
if (err != nil) { return false, 0, "", err }
neuralNetworkExists, neuralNetworkOutcomeIsKnown, predictedOutcome, _, _, _, err := createPersonGeneticAnalysis.GetGenomeDiscreteTraitAnalysis_NeuralNetwork(traitObject, userTraitLocusValuesMap, true)
@ -1117,7 +1029,7 @@ func GetAnyProfileAttributeIncludingCalculated(attributeName string, getProfileA
traitLociList := traitObject.LociList
userTraitLocusValuesMap, err := getUserGenomeLocusValuesMap(traitLociList, getProfileAttributesFunction)
userTraitLocusValuesMap, err := GetUserGenomeLocusValuesMapFromProfile(traitLociList, getProfileAttributesFunction)
if (err != nil) { return false, 0, "", err }
neuralNetworkExists, anyLociKnown, outcomeProbabilitiesMap, _, _, _, err := createCoupleGeneticAnalysis.GetOffspringDiscreteTraitAnalysis_NeuralNetwork(traitObject, myGenomeLocusValuesMap, userTraitLocusValuesMap)
@ -1190,7 +1102,7 @@ func GetAnyProfileAttributeIncludingCalculated(attributeName string, getProfileA
traitLociList := traitObject.LociList
userTraitLocusValuesMap, err := getUserGenomeLocusValuesMap(traitLociList, getProfileAttributesFunction)
userTraitLocusValuesMap, err := GetUserGenomeLocusValuesMapFromProfile(traitLociList, getProfileAttributesFunction)
if (err != nil) { return false, 0, "", err }
traitNeuralNetworkExists, anyLocusValuesAreKnown, predictedOutcome, _, _, _, err := createPersonGeneticAnalysis.GetGenomeNumericTraitAnalysis(traitObject, userTraitLocusValuesMap, true)
@ -1264,7 +1176,7 @@ func GetAnyProfileAttributeIncludingCalculated(attributeName string, getProfileA
traitLociList := traitObject.LociList
userTraitLocusValuesMap, err := getUserGenomeLocusValuesMap(traitLociList, getProfileAttributesFunction)
userTraitLocusValuesMap, err := GetUserGenomeLocusValuesMapFromProfile(traitLociList, getProfileAttributesFunction)
if (err != nil) { return false, 0, "", err }
neuralNetworkExists, anyLociKnown, predictedOutcome, _, _, _, _, err := createCoupleGeneticAnalysis.GetOffspringNumericTraitAnalysis(traitObject, userTraitLocusValuesMap, myGenomeLocusValuesMap)
@ -2070,7 +1982,7 @@ func GetAnyProfileAttributeIncludingCalculated(attributeName string, getProfileA
//Outputs:
// -map[int64]locusValue.LocusValue: Genome map for provided loci
// -error
func getUserGenomeLocusValuesMap(lociList []int64, getProfileAttributesFunction func(string)(bool, int, string, error))(map[int64]locusValue.LocusValue, error){
func GetUserGenomeLocusValuesMapFromProfile(lociList []int64, getProfileAttributesFunction func(string)(bool, int, string, error))(map[int64]locusValue.LocusValue, error){
// We construct the user's locus values map
// Map Structure: Locus rsID -> locusValue.LocusValue