From 39c4edbe2f862b67397287c7c0d7cfe2f5b20e1f Mon Sep 17 00:00:00 2001 From: Simon Sarasova Date: Wed, 14 Aug 2024 11:25:25 +0000 Subject: [PATCH] Created the GetUserGenomeLocusValuesMapFromProfile function and used it to remove some duplicated code. --- Changelog.md | 1 + Contributors.md | 2 +- gui/viewProfileGui.go | 160 +----------------- .../calculatedAttributes.go | 110 ++---------- 4 files changed, 21 insertions(+), 252 deletions(-) diff --git a/Changelog.md b/Changelog.md index 0b2b54a..07c57bd 100644 --- a/Changelog.md +++ b/Changelog.md @@ -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* diff --git a/Contributors.md b/Contributors.md index f733603..606f2a1 100644 --- a/Contributors.md +++ b/Contributors.md @@ -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 \ No newline at end of file +Simon Sarasova | June 13, 2023 | 282 \ No newline at end of file diff --git a/gui/viewProfileGui.go b/gui/viewProfileGui.go index 89ece49..8bedba3 100644 --- a/gui/viewProfileGui.go +++ b/gui/viewProfileGui.go @@ -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){ diff --git a/internal/profiles/calculatedAttributes/calculatedAttributes.go b/internal/profiles/calculatedAttributes/calculatedAttributes.go index 02414e5..ca0cdf4 100644 --- a/internal/profiles/calculatedAttributes/calculatedAttributes.go +++ b/internal/profiles/calculatedAttributes/calculatedAttributes.go @@ -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