Split the createGeneticAnalysis package into 2 packages: createPersonGeneticAnalysis and createCoupleGeneticAnalysis.

This commit is contained in:
Simon Sarasova 2024-06-15 00:43:01 +00:00
parent a53fee6ed8
commit 72d9c0a04e
No known key found for this signature in database
GPG key ID: EEDA4103C9C36944
13 changed files with 1399 additions and 1348 deletions

View file

@ -6,6 +6,7 @@ Small and insignificant changes may not be included in this log.
## Unversioned Changes
* Split the createGeneticAnalysis package into 2 packages: createPersonGeneticAnalysis and createCoupleGeneticAnalysis. - *Simon Sarasova*
* Upgraded Circl to version 1.3.9. - *Simon Sarasova*
* Renamed BroadcastTime/SentTime to CreationTime for every instance in which it is a better term to use. - *Simon Sarasova*
* Added "User Has Disease" information to the View Profile - Monogenic Diseases page. - *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 | 255
Simon Sarasova | June 13, 2023 | 256

View file

@ -307,7 +307,7 @@ The current method for predicting polygenic disease risks and traits is not as i
Our current model adds and subtracts the likelihood values of various SNPs that are reported to have an effect on polygenic diseases and traits.
A much better method is to train a neural net to predict traits and polygenic diseases on a large number of genes. There are methods that exist to find the set of genes that have an effect on each trait/disease. For example, height is said to be effected by ~10,000 SNPs. Many GWAS studies exist which report which genes are responsible for certain traits and diseases. These are the genes to feed into the neural net for each trait/disease. These are also the genes that users will share in their profiles. I have already started to try to build this system. See `geneticPrediction.go` for an implementation of trait prediction using neural networks, and `createGeneticAnalysis.go` for information on how offspring predictions would work.
A much better method is to train a neural net to predict traits and polygenic diseases on a large number of genes. There are methods that exist to find the set of genes that have an effect on each trait/disease. For example, height is said to be effected by ~10,000 SNPs. Many GWAS studies exist which report which genes are responsible for certain traits and diseases. These are the genes to feed into the neural net for each trait/disease. These are also the genes that users will share in their profiles. I have already started to try to build this system. See `geneticPrediction.go` for an implementation of trait prediction using neural networks, and `createCoupleGeneticAnalysis.go` for information on how offspring predictions would work.
This method requires training data, which is largely unavailable for public use. We need fully open training data, not data that requires registration or permission to download.

View file

@ -19,7 +19,8 @@ import "seekia/resources/geneticReferences/traits"
import "seekia/internal/appMemory"
import "seekia/internal/encoding"
import "seekia/internal/genetics/companyAnalysis"
import "seekia/internal/genetics/createGeneticAnalysis"
import "seekia/internal/genetics/createCoupleGeneticAnalysis"
import "seekia/internal/genetics/createPersonGeneticAnalysis"
import "seekia/internal/genetics/locusValue"
import "seekia/internal/genetics/myChosenAnalysis"
import "seekia/internal/genetics/myPeople"
@ -2731,7 +2732,7 @@ func setViewMateProfilePage_MonogenicDiseases(window fyne.Window, userOrOffsprin
myDiseaseInfoExists, myProbabilityOfPassingAVariant, myNumberOfVariantsTested, err := getMyDiseaseInfo()
if (err != nil) { return nil, err }
probabilityOffspringHasDiseaseIsKnown, probabilityOffspringHasDisease, probabilityOffspringHasVariantIsKnown, probabilityOffspringHasVariant, err := createGeneticAnalysis.GetOffspringMonogenicDiseaseProbabilities(diseaseIsDominantOrRecessive, userDiseaseInfoExists, userProbabilityOfPassingAVariant, myDiseaseInfoExists, myProbabilityOfPassingAVariant)
probabilityOffspringHasDiseaseIsKnown, probabilityOffspringHasDisease, probabilityOffspringHasVariantIsKnown, probabilityOffspringHasVariant, err := createCoupleGeneticAnalysis.GetOffspringMonogenicDiseaseProbabilities(diseaseIsDominantOrRecessive, userDiseaseInfoExists, userProbabilityOfPassingAVariant, myDiseaseInfoExists, myProbabilityOfPassingAVariant)
if (err != nil) { return nil, err }
getUserHasDiseaseString := func()string{
@ -3010,7 +3011,7 @@ func setViewMateProfilePage_PolygenicDiseases(window fyne.Window, userOrOffsprin
userDiseaseLocusValuesMap[locusRSID] = userLocusValue
}
userDiseaseInfoIsKnown, userDiseaseRiskScore, userNumberOfLociTested, _, err := createGeneticAnalysis.GetPersonGenomePolygenicDiseaseInfo(diseaseLociList, userDiseaseLocusValuesMap, true)
userDiseaseInfoIsKnown, userDiseaseRiskScore, userNumberOfLociTested, _, err := createPersonGeneticAnalysis.GetPersonGenomePolygenicDiseaseInfo(diseaseLociList, userDiseaseLocusValuesMap, true)
if (err != nil) { return nil, err }
getUserDiseaseRiskScoreString := func()(string, error){
@ -3030,7 +3031,7 @@ func setViewMateProfilePage_PolygenicDiseases(window fyne.Window, userOrOffsprin
userDiseaseRiskScoreString, err := getUserDiseaseRiskScoreString()
if (err != nil) { return nil, err }
anyOffspringLociTested, offspringDiseaseRiskScore, offspringNumberOfLociTested, _, offspringSampleRiskScoresList, err := createGeneticAnalysis.GetOffspringPolygenicDiseaseInfo(diseaseLociList, myDiseaseLocusValuesMap, userDiseaseLocusValuesMap)
anyOffspringLociTested, offspringDiseaseRiskScore, offspringNumberOfLociTested, _, offspringSampleRiskScoresList, err := createCoupleGeneticAnalysis.GetOffspringPolygenicDiseaseInfo(diseaseLociList, myDiseaseLocusValuesMap, userDiseaseLocusValuesMap)
if (err != nil) { return nil, err }
getOffspringDiseaseRiskScoreFormatted := func()(string, error){
@ -3241,13 +3242,13 @@ func setViewMateProfilePage_PolygenicDiseaseLoci(window fyne.Window, diseaseName
return
}
anyUserLociTested, _, userNumberOfLociTested, userDiseaseLocusInfoMap, err := createGeneticAnalysis.GetPersonGenomePolygenicDiseaseInfo(diseaseLocusObjectsList, userDiseaseLocusValuesMap, true)
anyUserLociTested, _, userNumberOfLociTested, userDiseaseLocusInfoMap, err := createPersonGeneticAnalysis.GetPersonGenomePolygenicDiseaseInfo(diseaseLocusObjectsList, userDiseaseLocusValuesMap, true)
if (err != nil) {
setErrorEncounteredPage(window, err, previousPage)
return
}
anyOffspringLociTested, _, offspringNumberOfLociTested, offspringLociInfoMap, _, err := createGeneticAnalysis.GetOffspringPolygenicDiseaseInfo(diseaseLocusObjectsList, myDiseaseLocusValuesMap, userDiseaseLocusValuesMap)
anyOffspringLociTested, _, offspringNumberOfLociTested, offspringLociInfoMap, _, err := createCoupleGeneticAnalysis.GetOffspringPolygenicDiseaseInfo(diseaseLocusObjectsList, myDiseaseLocusValuesMap, userDiseaseLocusValuesMap)
if (err != nil) {
setErrorEncounteredPage(window, err, previousPage)
return
@ -3648,7 +3649,7 @@ func setViewMateProfilePage_GeneticTraits(window fyne.Window, userOrOffspring st
ruleLociList := traitRuleObject.LociList
userRuleStatusIsKnown, userPassesRule, err := createGeneticAnalysis.GetGenomePassesTraitRuleStatus(ruleLociList, userTraitLocusValuesMap, true)
userRuleStatusIsKnown, userPassesRule, err := createPersonGeneticAnalysis.GetGenomePassesTraitRuleStatus(ruleLociList, userTraitLocusValuesMap, true)
if (err != nil) { return false, nil, 0, err }
if (userRuleStatusIsKnown == false){
continue
@ -3700,7 +3701,7 @@ func setViewMateProfilePage_GeneticTraits(window fyne.Window, userOrOffspring st
myTraitLocusValuesMap, _, _, _, _, err := readGeneticAnalysis.GetPersonTraitInfoFromGeneticAnalysis(myAnalysisObject, traitName, myGenomeIdentifier)
if (err != nil) { return false, nil, 0, err }
anyRuleTested, offspringNumberOfRulesTested, _, offspringAverageOutcomeScoresMap, err := createGeneticAnalysis.GetOffspringTraitInfo(traitObject, myTraitLocusValuesMap, userTraitLocusValuesMap)
anyRuleTested, offspringNumberOfRulesTested, _, offspringAverageOutcomeScoresMap, err := createCoupleGeneticAnalysis.GetOffspringTraitInfo(traitObject, myTraitLocusValuesMap, userTraitLocusValuesMap)
if (err != nil) { return false, nil, 0, err }
if (anyRuleTested == false){
return false, nil, 0, nil
@ -3962,7 +3963,7 @@ func setViewMateProfilePage_TraitRules(window fyne.Window, traitName string, use
return false, nil, nil
}
anyOffspringRulesTested, _, offspringProbabilityOfPassingRulesMap, _, err := createGeneticAnalysis.GetOffspringTraitInfo(traitObject, myTraitLocusValuesMap, userTraitLocusValuesMap)
anyOffspringRulesTested, _, offspringProbabilityOfPassingRulesMap, _, err := createCoupleGeneticAnalysis.GetOffspringTraitInfo(traitObject, myTraitLocusValuesMap, userTraitLocusValuesMap)
if (err != nil) { return false, nil, err }
if (anyOffspringRulesTested == false){
return false, nil, nil
@ -3999,7 +4000,7 @@ func setViewMateProfilePage_TraitRules(window fyne.Window, traitName string, use
ruleLociList := ruleObject.LociList
ruleStatusIsKnown, _, err := createGeneticAnalysis.GetGenomePassesTraitRuleStatus(ruleLociList, userTraitLocusValuesMap, true)
ruleStatusIsKnown, _, err := createPersonGeneticAnalysis.GetGenomePassesTraitRuleStatus(ruleLociList, userTraitLocusValuesMap, true)
if (err != nil) { return 0, err }
if (ruleStatusIsKnown == true){
numberOfRulesTested += 1
@ -4092,7 +4093,7 @@ func setViewMateProfilePage_TraitRules(window fyne.Window, traitName string, use
getUserPassesRuleString := func()(string, error){
userRuleStatusIsKnown, userPassesRule, err := createGeneticAnalysis.GetGenomePassesTraitRuleStatus(ruleLociList, userTraitLocusValuesMap, true)
userRuleStatusIsKnown, userPassesRule, err := createPersonGeneticAnalysis.GetGenomePassesTraitRuleStatus(ruleLociList, userTraitLocusValuesMap, true)
if (err != nil) { return "", err }
if (userRuleStatusIsKnown == false){

View file

@ -1,6 +1,6 @@
package createGeneticAnalysis_test
package createCoupleGeneticAnalysis_test
import "seekia/internal/genetics/createGeneticAnalysis"
import "seekia/internal/genetics/createCoupleGeneticAnalysis"
import "seekia/internal/genetics/readGeneticAnalysis"
@ -16,150 +16,6 @@ import "seekia/internal/helpers"
import "testing"
import "errors"
func TestCreatePersonGeneticAnalysis_SingleGenome(t *testing.T){
err := locusMetadata.InitializeLocusMetadataVariables()
if (err != nil) {
t.Fatalf("InitializeLocusMetadataVariables failed: " + err.Error())
}
monogenicDiseases.InitializeMonogenicDiseaseVariables()
polygenicDiseases.InitializePolygenicDiseaseVariables()
traits.InitializeTraitVariables()
genomeIdentifier, err := helpers.GetNewRandom16ByteArray()
if (err != nil) {
t.Fatalf("Failed to get random 16 byte array: " + err.Error())
}
fakeRawGenome, _, _, _, err := createRawGenomes.CreateFakeRawGenome_AncestryDNA()
if (err != nil) {
t.Fatalf("Failed to create fake raw AncestryDNA genome: " + err.Error())
}
genomeIsValid, rawGenomeWithMetadata, err := prepareRawGenomes.CreateRawGenomeWithMetadataObject(genomeIdentifier, fakeRawGenome)
if (err != nil){
t.Fatalf("CreateRawGenomeWithMetadataObject failed: " + err.Error())
}
if (genomeIsValid == false){
t.Fatalf("CreateRawGenomeWithMetadataObject failed: Genome is not valid.")
}
genomesList := []prepareRawGenomes.RawGenomeWithMetadata{rawGenomeWithMetadata}
updateProgressFunction := func(_ int)error{
return nil
}
checkIfProcessIsStoppedFunction := func()bool{
return false
}
processCompleted, personGeneticAnalysis, err := createGeneticAnalysis.CreatePersonGeneticAnalysis(genomesList, updateProgressFunction, checkIfProcessIsStoppedFunction)
if (err != nil){
t.Fatalf("Failed to create person genetic analysis: " + err.Error())
}
if (processCompleted == false){
t.Fatalf("Failed to create person genetic analysis: Process did not complete.")
}
personGeneticAnalysisObject, err := readGeneticAnalysis.ReadPersonGeneticAnalysisString(personGeneticAnalysis)
if (err != nil){
t.Fatalf("Failed to read person genetic analysis string: " + err.Error())
}
err = readGeneticAnalysis.VerifyPersonGeneticAnalysis(personGeneticAnalysisObject)
if (err != nil){
t.Fatalf("Failed to read person genetic analysis: " + err.Error())
}
}
func TestCreatePersonGeneticAnalysis_MultipleGenomes(t *testing.T){
err := locusMetadata.InitializeLocusMetadataVariables()
if (err != nil) {
t.Fatalf("InitializeLocusMetadataVariables failed: " + err.Error())
}
monogenicDiseases.InitializeMonogenicDiseaseVariables()
polygenicDiseases.InitializePolygenicDiseaseVariables()
traits.InitializeTraitVariables()
numberOfGenomesToAdd := helpers.GetRandomIntWithinRange(2, 5)
genomesList := make([]prepareRawGenomes.RawGenomeWithMetadata, 0, numberOfGenomesToAdd)
for i:=0; i < numberOfGenomesToAdd; i++{
genomeIdentifier, err := helpers.GetNewRandom16ByteArray()
if (err != nil) {
t.Fatalf("Failed to get random 16 byte array: " + err.Error())
}
getFakeRawGenome := func()(string, error){
is23andMe := helpers.GetRandomBool()
if (is23andMe == true){
fakeRawGenome, _, _, _, err := createRawGenomes.CreateFakeRawGenome_23andMe()
if (err != nil) {
return "", errors.New("Failed to create fake raw 23andMe genome: " + err.Error())
}
return fakeRawGenome, nil
}
fakeRawGenome, _, _, _, err := createRawGenomes.CreateFakeRawGenome_AncestryDNA()
if (err != nil) {
return "", errors.New("Failed to create fake raw AncestryDNA genome: " + err.Error())
}
return fakeRawGenome, nil
}
fakeRawGenome, err := getFakeRawGenome()
if (err != nil){
t.Fatalf("Failed to get fake raw genome: " + err.Error())
}
genomeIsValid, rawGenomeWithMetadata, err := prepareRawGenomes.CreateRawGenomeWithMetadataObject(genomeIdentifier, fakeRawGenome)
if (err != nil){
t.Fatalf("CreateRawGenomeWithMetadataObject failed: " + err.Error())
}
if (genomeIsValid == false){
t.Fatalf("CreateRawGenomeWithMetadataObject failed: Genome is not valid.")
}
genomesList = append(genomesList, rawGenomeWithMetadata)
}
updateProgressFunction := func(_ int)error{
return nil
}
checkIfProcessIsStoppedFunction := func()bool{
return false
}
processCompleted, personGeneticAnalysis, err := createGeneticAnalysis.CreatePersonGeneticAnalysis(genomesList, updateProgressFunction, checkIfProcessIsStoppedFunction)
if (err != nil){
t.Fatalf("Failed to create person genetic analysis: " + err.Error())
}
if (processCompleted == false){
t.Fatalf("Failed to create person genetic analysis: Process did not complete.")
}
personGeneticAnalysisObject, err := readGeneticAnalysis.ReadPersonGeneticAnalysisString(personGeneticAnalysis)
if (err != nil){
t.Fatalf("Failed to read person genetic analysis string: " + err.Error())
}
err = readGeneticAnalysis.VerifyPersonGeneticAnalysis(personGeneticAnalysisObject)
if (err != nil){
t.Fatalf("Failed to read person genetic analysis: " + err.Error())
}
}
func TestCreateCoupleGeneticAnalysis_SingleGenomes(t *testing.T){
@ -215,7 +71,7 @@ func TestCreateCoupleGeneticAnalysis_SingleGenomes(t *testing.T){
return false
}
processCompleted, coupleGeneticAnalysis, err := createGeneticAnalysis.CreateCoupleGeneticAnalysis(person1GenomesList, person2GenomesList, updateProgressFunction, checkIfProcessIsStoppedFunction)
processCompleted, coupleGeneticAnalysis, err := createCoupleGeneticAnalysis.CreateCoupleGeneticAnalysis(person1GenomesList, person2GenomesList, updateProgressFunction, checkIfProcessIsStoppedFunction)
if (err != nil){
t.Fatalf("Failed to create couple genetic analysis: " + err.Error())
}
@ -313,7 +169,7 @@ func TestCreateCoupleGeneticAnalysis_SingleAndMultipleGenomes(t *testing.T){
return false
}
processCompleted, coupleGeneticAnalysis, err := createGeneticAnalysis.CreateCoupleGeneticAnalysis(person1GenomesList, person2GenomesList, updateProgressFunction, checkIfProcessIsStoppedFunction)
processCompleted, coupleGeneticAnalysis, err := createCoupleGeneticAnalysis.CreateCoupleGeneticAnalysis(person1GenomesList, person2GenomesList, updateProgressFunction, checkIfProcessIsStoppedFunction)
if (err != nil){
t.Fatalf("Failed to create couple genetic analysis: " + err.Error())
}
@ -406,7 +262,7 @@ func TestCreateCoupleGeneticAnalysis_MultipleGenomes(t *testing.T){
return false
}
processCompleted, coupleGeneticAnalysis, err := createGeneticAnalysis.CreateCoupleGeneticAnalysis(person1GenomesList, person2GenomesList, updateProgressFunction, checkIfProcessIsStoppedFunction)
processCompleted, coupleGeneticAnalysis, err := createCoupleGeneticAnalysis.CreateCoupleGeneticAnalysis(person1GenomesList, person2GenomesList, updateProgressFunction, checkIfProcessIsStoppedFunction)
if (err != nil){
t.Fatalf("Failed to create couple genetic analysis: " + err.Error())
}
@ -425,3 +281,4 @@ func TestCreateCoupleGeneticAnalysis_MultipleGenomes(t *testing.T){
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,164 @@
package createPersonGeneticAnalysis_test
import "seekia/internal/genetics/createPersonGeneticAnalysis"
import "seekia/internal/genetics/readGeneticAnalysis"
import "seekia/resources/geneticReferences/locusMetadata"
import "seekia/resources/geneticReferences/monogenicDiseases"
import "seekia/resources/geneticReferences/polygenicDiseases"
import "seekia/resources/geneticReferences/traits"
import "seekia/internal/genetics/createRawGenomes"
import "seekia/internal/genetics/prepareRawGenomes"
import "seekia/internal/helpers"
import "testing"
import "errors"
func TestCreatePersonGeneticAnalysis_SingleGenome(t *testing.T){
err := locusMetadata.InitializeLocusMetadataVariables()
if (err != nil) {
t.Fatalf("InitializeLocusMetadataVariables failed: " + err.Error())
}
monogenicDiseases.InitializeMonogenicDiseaseVariables()
polygenicDiseases.InitializePolygenicDiseaseVariables()
traits.InitializeTraitVariables()
genomeIdentifier, err := helpers.GetNewRandom16ByteArray()
if (err != nil) {
t.Fatalf("Failed to get random 16 byte array: " + err.Error())
}
fakeRawGenome, _, _, _, err := createRawGenomes.CreateFakeRawGenome_AncestryDNA()
if (err != nil) {
t.Fatalf("Failed to create fake raw AncestryDNA genome: " + err.Error())
}
genomeIsValid, rawGenomeWithMetadata, err := prepareRawGenomes.CreateRawGenomeWithMetadataObject(genomeIdentifier, fakeRawGenome)
if (err != nil){
t.Fatalf("CreateRawGenomeWithMetadataObject failed: " + err.Error())
}
if (genomeIsValid == false){
t.Fatalf("CreateRawGenomeWithMetadataObject failed: Genome is not valid.")
}
genomesList := []prepareRawGenomes.RawGenomeWithMetadata{rawGenomeWithMetadata}
updateProgressFunction := func(_ int)error{
return nil
}
checkIfProcessIsStoppedFunction := func()bool{
return false
}
processCompleted, personGeneticAnalysis, err := createPersonGeneticAnalysis.CreatePersonGeneticAnalysis(genomesList, updateProgressFunction, checkIfProcessIsStoppedFunction)
if (err != nil){
t.Fatalf("Failed to create person genetic analysis: " + err.Error())
}
if (processCompleted == false){
t.Fatalf("Failed to create person genetic analysis: Process did not complete.")
}
personGeneticAnalysisObject, err := readGeneticAnalysis.ReadPersonGeneticAnalysisString(personGeneticAnalysis)
if (err != nil){
t.Fatalf("Failed to read person genetic analysis string: " + err.Error())
}
err = readGeneticAnalysis.VerifyPersonGeneticAnalysis(personGeneticAnalysisObject)
if (err != nil){
t.Fatalf("Failed to read person genetic analysis: " + err.Error())
}
}
func TestCreatePersonGeneticAnalysis_MultipleGenomes(t *testing.T){
err := locusMetadata.InitializeLocusMetadataVariables()
if (err != nil) {
t.Fatalf("InitializeLocusMetadataVariables failed: " + err.Error())
}
monogenicDiseases.InitializeMonogenicDiseaseVariables()
polygenicDiseases.InitializePolygenicDiseaseVariables()
traits.InitializeTraitVariables()
numberOfGenomesToAdd := helpers.GetRandomIntWithinRange(2, 5)
genomesList := make([]prepareRawGenomes.RawGenomeWithMetadata, 0, numberOfGenomesToAdd)
for i:=0; i < numberOfGenomesToAdd; i++{
genomeIdentifier, err := helpers.GetNewRandom16ByteArray()
if (err != nil) {
t.Fatalf("Failed to get random 16 byte array: " + err.Error())
}
getFakeRawGenome := func()(string, error){
is23andMe := helpers.GetRandomBool()
if (is23andMe == true){
fakeRawGenome, _, _, _, err := createRawGenomes.CreateFakeRawGenome_23andMe()
if (err != nil) {
return "", errors.New("Failed to create fake raw 23andMe genome: " + err.Error())
}
return fakeRawGenome, nil
}
fakeRawGenome, _, _, _, err := createRawGenomes.CreateFakeRawGenome_AncestryDNA()
if (err != nil) {
return "", errors.New("Failed to create fake raw AncestryDNA genome: " + err.Error())
}
return fakeRawGenome, nil
}
fakeRawGenome, err := getFakeRawGenome()
if (err != nil){
t.Fatalf("Failed to get fake raw genome: " + err.Error())
}
genomeIsValid, rawGenomeWithMetadata, err := prepareRawGenomes.CreateRawGenomeWithMetadataObject(genomeIdentifier, fakeRawGenome)
if (err != nil){
t.Fatalf("CreateRawGenomeWithMetadataObject failed: " + err.Error())
}
if (genomeIsValid == false){
t.Fatalf("CreateRawGenomeWithMetadataObject failed: Genome is not valid.")
}
genomesList = append(genomesList, rawGenomeWithMetadata)
}
updateProgressFunction := func(_ int)error{
return nil
}
checkIfProcessIsStoppedFunction := func()bool{
return false
}
processCompleted, personGeneticAnalysis, err := createPersonGeneticAnalysis.CreatePersonGeneticAnalysis(genomesList, updateProgressFunction, checkIfProcessIsStoppedFunction)
if (err != nil){
t.Fatalf("Failed to create person genetic analysis: " + err.Error())
}
if (processCompleted == false){
t.Fatalf("Failed to create person genetic analysis: Process did not complete.")
}
personGeneticAnalysisObject, err := readGeneticAnalysis.ReadPersonGeneticAnalysisString(personGeneticAnalysis)
if (err != nil){
t.Fatalf("Failed to read person genetic analysis string: " + err.Error())
}
err = readGeneticAnalysis.VerifyPersonGeneticAnalysis(personGeneticAnalysisObject)
if (err != nil){
t.Fatalf("Failed to read person genetic analysis: " + err.Error())
}
}

View file

@ -1,6 +1,6 @@
// createRawGenomes provides functions to create fake raw genome files
// This package's functions are only used to test the readRawGenomes and createGeneticAnalysis packages.
// This package's functions are only used to test the readRawGenomes, createPersonGeneticAnalysis, and createCoupleGeneticAnalysis packages.
package createRawGenomes

View file

@ -1,6 +1,6 @@
// myAnalyses provides functions to manage genome analyses for People and Couples
// Analyses are created using the createGeneticAnalysis package
// Analyses are created using the createPersonGeneticAnalysis and createCoupleGeneticAnalysis packagees
package myAnalyses
@ -10,7 +10,8 @@ import "seekia/internal/encoding"
import "seekia/internal/helpers"
import "seekia/internal/localFilesystem"
import "seekia/internal/myDatastores/myMapList"
import "seekia/internal/genetics/createGeneticAnalysis"
import "seekia/internal/genetics/createCoupleGeneticAnalysis"
import "seekia/internal/genetics/createPersonGeneticAnalysis"
import "seekia/internal/genetics/geneticAnalysis"
import "seekia/internal/genetics/prepareRawGenomes"
import "seekia/internal/genetics/readGeneticAnalysis"
@ -673,7 +674,7 @@ func StartCreateNewPersonGeneticAnalysis(personIdentifier string)(string, error)
return nil
}
processCompleted, newGeneticAnalysisString, err := createGeneticAnalysis.CreatePersonGeneticAnalysis(genomesList, analysisUpdatePercentageCompleteFunction, checkIfProcessIsStopped)
processCompleted, newGeneticAnalysisString, err := createPersonGeneticAnalysis.CreatePersonGeneticAnalysis(genomesList, analysisUpdatePercentageCompleteFunction, checkIfProcessIsStopped)
if (err != nil) { return err }
if (processCompleted == false){
// User stopped the analysis mid-way
@ -986,7 +987,7 @@ func StartCreateNewCoupleGeneticAnalysis(inputPerson1Identifier string, inputPer
return nil
}
processCompleted, newGeneticAnalysisString, err := createGeneticAnalysis.CreateCoupleGeneticAnalysis(person1GenomesList, person2GenomesList, updateCoupleAnalysisPercentageCompleteFunction, checkIfProcessIsStopped)
processCompleted, newGeneticAnalysisString, err := createCoupleGeneticAnalysis.CreateCoupleGeneticAnalysis(person1GenomesList, person2GenomesList, updateCoupleAnalysisPercentageCompleteFunction, checkIfProcessIsStopped)
if (err != nil) { return err }
if (processCompleted == false){
// User stopped the analysis mid-way

View file

@ -18,7 +18,8 @@ import "seekia/internal/desires/myLocalDesires"
import "seekia/internal/desires/myMateDesires"
import "seekia/internal/encoding"
import "seekia/internal/genetics/companyAnalysis"
import "seekia/internal/genetics/createGeneticAnalysis"
import "seekia/internal/genetics/createCoupleGeneticAnalysis"
import "seekia/internal/genetics/createPersonGeneticAnalysis"
import "seekia/internal/genetics/locusValue"
import "seekia/internal/genetics/myChosenAnalysis"
import "seekia/internal/genetics/readGeneticAnalysis"
@ -556,7 +557,7 @@ func GetAnyProfileAttributeIncludingCalculated(attributeName string, getProfileA
userProbabilityOfPassingADiseaseVariantInt, err := getUserProbabilityOfPassingADiseaseVariantInt()
if (err != nil) { return false, 0, "", err }
probabilityOffspringHasDiseaseIsKnown, offspringPercentageProbabilityOfDisease, _, _, err := createGeneticAnalysis.GetOffspringMonogenicDiseaseProbabilities(diseaseIsDominantOrRecessive, myProbabilityIsKnown, myProbabilityOfPassingADiseaseVariant, userProbabilityIsKnown, userProbabilityOfPassingADiseaseVariantInt)
probabilityOffspringHasDiseaseIsKnown, offspringPercentageProbabilityOfDisease, _, _, err := createCoupleGeneticAnalysis.GetOffspringMonogenicDiseaseProbabilities(diseaseIsDominantOrRecessive, myProbabilityIsKnown, myProbabilityOfPassingADiseaseVariant, userProbabilityIsKnown, userProbabilityOfPassingADiseaseVariantInt)
if (err != nil) { return false, 0, "", err }
if (probabilityOffspringHasDiseaseIsKnown == false){
@ -712,7 +713,7 @@ func GetAnyProfileAttributeIncludingCalculated(attributeName string, getProfileA
userDiseaseLocusValuesMap[locusRSID] = userLocusValue
}
anyLocusTested, userDiseaseRiskScore, _, _, err := createGeneticAnalysis.GetPersonGenomePolygenicDiseaseInfo(diseaseLociList, userDiseaseLocusValuesMap, true)
anyLocusTested, userDiseaseRiskScore, _, _, err := createPersonGeneticAnalysis.GetPersonGenomePolygenicDiseaseInfo(diseaseLociList, userDiseaseLocusValuesMap, true)
if (err != nil) { return false, 0, "", err }
if (anyLocusTested == false){
continue
@ -817,7 +818,7 @@ func GetAnyProfileAttributeIncludingCalculated(attributeName string, getProfileA
userDiseaseLocusValuesMap[locusRSID] = newLocusValue
}
anyLocusValuesTested, offspringAverageRiskScore, _, err := createGeneticAnalysis.GetOffspringPolygenicDiseaseInfo_Fast(diseaseLociList, myDiseaseLocusValuesMap, userDiseaseLocusValuesMap)
anyLocusValuesTested, offspringAverageRiskScore, _, err := createCoupleGeneticAnalysis.GetOffspringPolygenicDiseaseInfo_Fast(diseaseLociList, myDiseaseLocusValuesMap, userDiseaseLocusValuesMap)
if (err != nil) { return false, 0, "", err }
if (anyLocusValuesTested == false){
continue

View file

@ -7,7 +7,7 @@ package traits
// These will be trained on a set of genomes and will output a probability analysis for each trait
// This is only possible once we get access to the necessary training data
//
// See createGeneticAnalysis.go for an explanation of how offspring trait prediction could work with neural nets
// See geneticPrediction.go for a non-working attempt to predict traits with neural nets
import "errors"

View file

@ -14,7 +14,8 @@ import "seekia/resources/geneticReferences/traits"
import "seekia/internal/encoding"
import "seekia/internal/localFilesystem"
import "seekia/internal/genetics/createGeneticAnalysis"
import "seekia/internal/genetics/createCoupleGeneticAnalysis"
import "seekia/internal/genetics/createPersonGeneticAnalysis"
import "seekia/internal/genetics/prepareRawGenomes"
import "errors"
@ -67,7 +68,7 @@ func main(){
return false
}
processCompleted, personGeneticAnalysis, err := createGeneticAnalysis.CreatePersonGeneticAnalysis(personGenomesList, updateProgressFunction, checkIfProcessIsStoppedFunction)
processCompleted, personGeneticAnalysis, err := createPersonGeneticAnalysis.CreatePersonGeneticAnalysis(personGenomesList, updateProgressFunction, checkIfProcessIsStoppedFunction)
if (err != nil){
return false, nil, "", errors.New("Failed to create person genetic analysis: " + err.Error())
}
@ -108,7 +109,7 @@ func main(){
return false
}
processCompleted, coupleGeneticAnalysis, err := createGeneticAnalysis.CreateCoupleGeneticAnalysis(person1GenomeList, person2GenomeList, updateProgressFunction, checkIfProcessIsStoppedFunction)
processCompleted, coupleGeneticAnalysis, err := createCoupleGeneticAnalysis.CreateCoupleGeneticAnalysis(person1GenomeList, person2GenomeList, updateProgressFunction, checkIfProcessIsStoppedFunction)
if (err != nil){
log.Println("Failed to create couple genetic analysis: " + err.Error())
return