Created the GetUserGenomeLocusValuesMapFromProfile function and used it to remove some duplicated code.
This commit is contained in:
parent
b6f5612bbc
commit
39c4edbe2f
4 changed files with 21 additions and 252 deletions
|
@ -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*
|
||||
|
|
|
@ -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
|
|
@ -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)
|
||||
userDiseaseLocusValuesMap, err := calculatedAttributes.GetUserGenomeLocusValuesMapFromProfile(diseaseLociList, getAnyUserProfileAttributeFunction)
|
||||
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
|
||||
}
|
||||
|
||||
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)
|
||||
userTraitLocusValuesMap, err := calculatedAttributes.GetUserGenomeLocusValuesMapFromProfile(traitLociList, getAnyUserProfileAttributeFunction)
|
||||
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
|
||||
}
|
||||
|
||||
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{
|
||||
|
||||
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)
|
||||
userTraitLocusValuesMap, err := calculatedAttributes.GetUserGenomeLocusValuesMapFromProfile(traitLociList_Rules, getAnyUserProfileAttributeFunction)
|
||||
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)
|
||||
userTraitLocusValuesMap, err := calculatedAttributes.GetUserGenomeLocusValuesMapFromProfile(traitLociList, getAnyUserProfileAttributeFunction)
|
||||
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
|
||||
}
|
||||
|
||||
getPredictedOutcomeLabel := func(analysisExists bool, predictedOutcome float64)(fyne.Widget, error){
|
||||
|
||||
|
|
|
@ -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)
|
||||
userDiseaseLocusValuesMap, err := GetUserGenomeLocusValuesMapFromProfile(diseaseLociList, getProfileAttributesFunction)
|
||||
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
|
||||
}
|
||||
|
||||
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)
|
||||
userDiseaseLocusValuesMap, err := GetUserGenomeLocusValuesMapFromProfile(diseaseLociList, getProfileAttributesFunction)
|
||||
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
|
||||
}
|
||||
|
||||
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
|
||||
|
|
Loading…
Reference in a new issue