Split the createGeneticAnalysis package into 2 packages: createPersonGeneticAnalysis and createCoupleGeneticAnalysis.
This commit is contained in:
parent
a53fee6ed8
commit
72d9c0a04e
13 changed files with 1399 additions and 1348 deletions
|
@ -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*
|
||||
|
|
|
@ -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
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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){
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -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
|
@ -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())
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue