From 02676dbda1c22528902aba71e00885256f417c83 Mon Sep 17 00:00:00 2001 From: Simon Sarasova Date: Wed, 14 Aug 2024 03:37:18 +0000 Subject: [PATCH] Added the Obesity disease to genetic analyses. --- Changelog.md | 1 + Contributors.md | 2 +- internal/appUsers/appUsers.go | 3 +- internal/generate/generate_test.go | 8 +- .../createCoupleGeneticAnalysis_test.go | 18 +- .../createPersonGeneticAnalysis_test.go | 12 +- .../geneticPrediction/geneticPrediction.go | 26 +- .../SampleCoupleAnalysis.messagepack | Bin 14148 -> 15484 bytes .../SamplePerson1Analysis.messagepack | Bin 33840 -> 35190 bytes .../SamplePerson2Analysis.messagepack | Bin 19952 -> 21608 bytes .../sampleAnalyses/sampleAnalyses_test.go | 16 +- .../serverRequest/serverRequest_test.go | 12 +- .../serverResponse/serverResponse_test.go | 12 +- .../attributeDisplay/attributeDisplay_test.go | 5 +- .../profileFormat/profileFormat_test.go | 13 +- .../geneticPredictionModels.go | 12 + .../geneticPredictionModels_test.go | 4 +- .../ObesityModelAccuracy.gob | Bin 0 -> 3098 bytes .../predictionModels/ObesityModel.gob | Bin 0 -> 53212 bytes .../geneticReferences_test.go | 5 +- .../locusMetadata/LocusMetadata.gob | Bin 209801 -> 399647 bytes .../polygenicDiseases/obesity.go | 83 ++++++ .../polygenicDiseases/polygenicDiseases.go | 9 +- .../rsIDs/GiantObesityStudyLoci.gob | Bin 0 -> 5019 bytes .../polygenicDiseases/rsIDs/ReadMe.md | 2 + .../createGeneticModels.go | 23 +- .../createSampleGeneticAnalyses.go | 7 +- utilities/extractGiantLoci/.gitignore | 2 + .../extractGiantLoci/extractGiantLoci.go | 236 +++++++++++++----- 29 files changed, 408 insertions(+), 103 deletions(-) create mode 100644 resources/geneticPredictionModels/predictionModelAccuracies/ObesityModelAccuracy.gob create mode 100644 resources/geneticPredictionModels/predictionModels/ObesityModel.gob create mode 100644 resources/geneticReferences/polygenicDiseases/obesity.go create mode 100644 resources/geneticReferences/polygenicDiseases/rsIDs/GiantObesityStudyLoci.gob create mode 100644 resources/geneticReferences/polygenicDiseases/rsIDs/ReadMe.md diff --git a/Changelog.md b/Changelog.md index 58988ca..4a4dde7 100644 --- a/Changelog.md +++ b/Changelog.md @@ -6,6 +6,7 @@ Small and insignificant changes may not be included in this log. ## Unversioned Changes +* Added the Obesity disease to genetic analyses. - *Simon Sarasova* * Implemented neural network prediction for polygenic diseases to replace old method. Added autism and homosexualness to genetic analyses. - *Simon Sarasova* * Increased the quantity of attributes that are extracted from the OpenSNP biobank data archive. - *Simon Sarasova* * Added numeric traits to genetic analyses. - *Simon Sarasova* diff --git a/Contributors.md b/Contributors.md index 4630e50..7a851f0 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 | 278 \ No newline at end of file +Simon Sarasova | June 13, 2023 | 279 \ No newline at end of file diff --git a/internal/appUsers/appUsers.go b/internal/appUsers/appUsers.go index c69d3e9..8e8c38c 100644 --- a/internal/appUsers/appUsers.go +++ b/internal/appUsers/appUsers.go @@ -395,7 +395,8 @@ func initializeApplicationVariables()error{ monogenicDiseases.InitializeMonogenicDiseaseVariables() - polygenicDiseases.InitializePolygenicDiseaseVariables() + err = polygenicDiseases.InitializePolygenicDiseaseVariables() + if (err != nil) { return err } err = traits.InitializeTraitVariables() if (err != nil) { return err } diff --git a/internal/generate/generate_test.go b/internal/generate/generate_test.go index 30d29e6..ee4e768 100644 --- a/internal/generate/generate_test.go +++ b/internal/generate/generate_test.go @@ -37,9 +37,13 @@ func TestGenerateParameters(t *testing.T){ func TestGenerateProfiles(t *testing.T){ monogenicDiseases.InitializeMonogenicDiseaseVariables() - polygenicDiseases.InitializePolygenicDiseaseVariables() - err := traits.InitializeTraitVariables() + err := polygenicDiseases.InitializePolygenicDiseaseVariables() + if (err != nil) { + t.Fatalf("InitializePolygenicDiseaseVariables failed: " + err.Error()) + } + + err = traits.InitializeTraitVariables() if (err != nil) { t.Fatalf("InitializeTraitVariables failed: " + err.Error()) } diff --git a/internal/genetics/createCoupleGeneticAnalysis/createCoupleGeneticAnalysis_test.go b/internal/genetics/createCoupleGeneticAnalysis/createCoupleGeneticAnalysis_test.go index bc6852c..abd3c84 100644 --- a/internal/genetics/createCoupleGeneticAnalysis/createCoupleGeneticAnalysis_test.go +++ b/internal/genetics/createCoupleGeneticAnalysis/createCoupleGeneticAnalysis_test.go @@ -25,7 +25,11 @@ func TestCreateCoupleGeneticAnalysis_SingleGenomes(t *testing.T){ } monogenicDiseases.InitializeMonogenicDiseaseVariables() - polygenicDiseases.InitializePolygenicDiseaseVariables() + + err = polygenicDiseases.InitializePolygenicDiseaseVariables() + if (err != nil) { + t.Fatalf("InitializePolygenicDiseaseVariables failed: " + err.Error()) + } err = traits.InitializeTraitVariables() if (err != nil) { @@ -104,7 +108,11 @@ func TestCreateCoupleGeneticAnalysis_SingleAndMultipleGenomes(t *testing.T){ } monogenicDiseases.InitializeMonogenicDiseaseVariables() - polygenicDiseases.InitializePolygenicDiseaseVariables() + + err = polygenicDiseases.InitializePolygenicDiseaseVariables() + if (err != nil) { + t.Fatalf("InitializePolygenicDiseaseVariables failed: " + err.Error()) + } err = traits.InitializeTraitVariables() if (err != nil) { @@ -206,7 +214,11 @@ func TestCreateCoupleGeneticAnalysis_MultipleGenomes(t *testing.T){ } monogenicDiseases.InitializeMonogenicDiseaseVariables() - polygenicDiseases.InitializePolygenicDiseaseVariables() + + err = polygenicDiseases.InitializePolygenicDiseaseVariables() + if (err != nil) { + t.Fatalf("InitializePolygenicDiseaseVariables failed: " + err.Error()) + } err = traits.InitializeTraitVariables() if (err != nil) { diff --git a/internal/genetics/createPersonGeneticAnalysis/createPersonGeneticAnalysis_test.go b/internal/genetics/createPersonGeneticAnalysis/createPersonGeneticAnalysis_test.go index 408ff7f..90d699a 100644 --- a/internal/genetics/createPersonGeneticAnalysis/createPersonGeneticAnalysis_test.go +++ b/internal/genetics/createPersonGeneticAnalysis/createPersonGeneticAnalysis_test.go @@ -25,7 +25,11 @@ func TestCreatePersonGeneticAnalysis_SingleGenome(t *testing.T){ } monogenicDiseases.InitializeMonogenicDiseaseVariables() - polygenicDiseases.InitializePolygenicDiseaseVariables() + + err = polygenicDiseases.InitializePolygenicDiseaseVariables() + if (err != nil) { + t.Fatalf("InitializePolygenicDiseaseVariables failed: " + err.Error()) + } err = traits.InitializeTraitVariables() if (err != nil) { @@ -88,7 +92,11 @@ func TestCreatePersonGeneticAnalysis_MultipleGenomes(t *testing.T){ } monogenicDiseases.InitializeMonogenicDiseaseVariables() - polygenicDiseases.InitializePolygenicDiseaseVariables() + + err = polygenicDiseases.InitializePolygenicDiseaseVariables() + if (err != nil) { + t.Fatalf("InitializePolygenicDiseaseVariables failed: " + err.Error()) + } err = traits.InitializeTraitVariables() if (err != nil) { diff --git a/internal/genetics/geneticPrediction/geneticPrediction.go b/internal/genetics/geneticPrediction/geneticPrediction.go index 858657a..a75e4a5 100644 --- a/internal/genetics/geneticPrediction/geneticPrediction.go +++ b/internal/genetics/geneticPrediction/geneticPrediction.go @@ -804,7 +804,8 @@ func GetNumericOutcomeValueFromOutputLayer(attributeName string, outputLayer []f return 54, 272, nil } case "Autism", - "Homosexualness":{ + "Homosexualness", + "Obesity":{ return 0, 10, nil } } @@ -860,6 +861,11 @@ func getNeuralNetworkLayerSizes(attributeName string)(int, int, int, int, error) // There is 1 output neuron, representing a homosexualness value return 12, 10, 5, 1, nil } + case "Obesity":{ + // There are 3000 input neurons + // There is 1 output neuron, representing an obesity value + return 3000, 3, 2, 1, nil + } } return 0, 0, 0, 0, errors.New("getNeuralNetworkLayerSizes called with unknown attributeName: " + attributeName) @@ -931,7 +937,8 @@ func CreateGeneticPredictionTrainingData_OpenSNP( return traitLociList, nil } - case "Autism":{ + case "Autism", + "Obesity":{ diseaseObject, err := polygenicDiseases.GetPolygenicDiseaseObject(attributeName) if (err != nil) { return nil, err } @@ -1106,6 +1113,21 @@ func CreateGeneticPredictionTrainingData_OpenSNP( outputLayer := []float32{outputValueFloat32} + return true, outputLayer, nil + } + case "Obesity":{ + + userObesityIsKnown := userPhenotypeDataObject.ObesityIsKnown + if (userObesityIsKnown == false){ + return false, nil, nil + } + + userObesity := userPhenotypeDataObject.Obesity + + outputValueFloat32 := float32(userObesity) + + outputLayer := []float32{outputValueFloat32} + return true, outputLayer, nil } } diff --git a/internal/genetics/sampleAnalyses/SampleCoupleAnalysis.messagepack b/internal/genetics/sampleAnalyses/SampleCoupleAnalysis.messagepack index 52b1029a28a84b1b215e8b2cf52baa27bbf458a8..a46ea6271fb2c99c7c3423ea802c150e8d73d503 100644 GIT binary patch delta 2257 zcmX|DTTEP46g~Ie8D@sp%)pdKDFgH&Q*3<DNLrZoTMfyw0C)ANh+V)UGKUrhBmW<+fNUSV{K z(YT8OAHsf|xgCz_7a|1i3C9d(vs*xojv319uLr7OZWp6xU=@?MVSSCWv^i#}_3-9B zkcXHYVN}b(dl&_r#GemtAwW#QFSO>CRp2Bxg)o77I5y uW9F#j#CXV2rtbi$h*# z^fIG^?AXiPONLg?d@g|cyIXKTrY~;RaFLTG(?*yag95bBF zW|xF0=3)|T^*D*e*b15;TF~mvE*F;Z)fKrB)^_8{ne^k}_|Os@4F`X=f1{i*AMMX( zH^2@vSHZE>T&j=De-Q^~|6V|Z&iP&d_vl+U^@L-Y5p8)Ku$vQhz`XU&3b-gI9AIl5 zb5Amg<7V|{ck~Xk-)SJJU0>XFoZdNw%+ zkBD8jze=<7YiG3B=kfUi8Kdd9pW+$gzhAwPjInz7c1y;H|8gF9=I(lX#`tmeX8hxZ zGTW|8>#+|mb+XI#6eyNVNwj=r72jkc7&iBWX0wXf(#LYNRc1< zMqEh_?M9jj$BbSTD?qqea>R-eYLhkbYRhmE4>!N)gAWvgii0|kkM1Pyb?kvrKubOU zjC=}&g(Pc`55+)}6>Cihn?xlQF@jD|Y$(S`t+Cv~w9(1f&1kM^&=&H9Tv8q^260d= zLYQ7cm_YhkA4fpXDHam+?-l(b>c`|$L_y9v3^Kru{cMKbP;0Pr6oN^mgwSL{*kM9= zT&RS4xrpYravVgM+5+9CTv#6Bu=~VeeTjqM5{I{evSR+}q*L4|Xd(GQEeK)n+>dp) z5pNrXK#mFF<)eN>BZz~*&>_%wN`v=;P$Bz4?TCY%Q7j%HLWkHI2504_9->3vbb@yR zuLNCmF$en@;gzF9u=`Y&<|Nj}9&F%~Ai`vY$`W#)tlX%Va+V%>Egq=CzXRlx&lWro LZo&3Q5E{m%c_Y*Jkvlq7H2 zbK0_ep!PgQ^A1LVY(|S#Mot@}*BOkyS(tV+>yb!zGZ}3ZFxtsy^gW%?dJZF>nQ3cI zZYsHqCW|&{#r~0+(-_UAGJ2K5q=A%GlCvY!WOdRLX_mJ6sWuCvTz)`F{-zcx?lg&W z+I*=hlDpEb6<1G*?#1v^e^T;%o^d3ld!Be*Qkq)dY)eXSqYpeu$@}#kfBybraZqnf zp7z2WGr4Xoc1*`+)b53j=vAd~t^JxZJ$6|M#nela6N);nglV+Gpb-8p|xWg%5mrW~wo^jd_*9k2L z)UV5yeo^MRi|9tss6g%zjWyX5W5`s&IgE4wbe`v~*T3PX)m3f@21Pq8{8B+5W_}MpV2YvmV^pdKlqu9keoZvq9Z(yFejOA#(dTC5(;s z;&+W;AI+#p7+i^RD_j?}3)qnxS|%ur#yDmSCs6Uh4ubZeTnai0w-}lqT8bY0xn#P< zcT@oPoGv?zD_+(r_4rB>xp*JI?J9?M3_X(`d><(1(}e>V zm4#dhC=WD<=|#{w(LH5M`*%xDV8~ts8xTx|W(C#5t%f#)eV@i3X+h48+;L3X#Wk04 WOD6E$&Y;|91ZlX!r@i#wm;M5)AC+SO diff --git a/internal/genetics/sampleAnalyses/SamplePerson1Analysis.messagepack b/internal/genetics/sampleAnalyses/SamplePerson1Analysis.messagepack index f4135b664ae6ef79185cafd4628305b8237c4553..70e2b073ae6ca49dec59dd0ec6848e9c45c4afce 100644 GIT binary patch delta 5690 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 P6Jv*`MAPZ-Tl4<|aa<{p delta 4723 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 delta 2626 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 literal 0 HcmV?d00001 diff --git a/resources/geneticPredictionModels/predictionModels/ObesityModel.gob b/resources/geneticPredictionModels/predictionModels/ObesityModel.gob new file mode 100644 index 0000000000000000000000000000000000000000..fc4cccab9c04d2b63db022ef211e4c1f60867f2c GIT binary patch literal 53212 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 Mku8*82*2Q<|6`r#DF6Tf literal 0 HcmV?d00001 diff --git a/resources/geneticReferences/geneticReferences_test.go b/resources/geneticReferences/geneticReferences_test.go index 4ca39d3..1666efd 100644 --- a/resources/geneticReferences/geneticReferences_test.go +++ b/resources/geneticReferences/geneticReferences_test.go @@ -185,7 +185,10 @@ func TestGeneticReferences(t *testing.T){ } } - polygenicDiseases.InitializePolygenicDiseaseVariables() + err = polygenicDiseases.InitializePolygenicDiseaseVariables() + if (err != nil){ + t.Fatalf("InitializePolygenicDiseaseVariables failed: " + err.Error()) + } polygenicDiseaseObjectsList, err := polygenicDiseases.GetPolygenicDiseaseObjectsList() if (err != nil) { diff --git a/resources/geneticReferences/locusMetadata/LocusMetadata.gob b/resources/geneticReferences/locusMetadata/LocusMetadata.gob index c81c03b2e2f7064ec6fd3a75eaad139674c1fb06..2ffbb1bbe7b2e7f321c3bfb17868bc8b1a5638c9 100644 GIT binary patch delta 28964 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 References Map + locusReferencesMap := make(map[int64]map[string]string) + + referencesMap_List1 := make(map[string]string) + referencesMap_List1["GIANT consortium - Meta-analyses of Genome-Wide Association Studies - 2022 - Obesity"] = "https://portals.broadinstitute.org/collaboration/giant/index.php/GIANT_consortium_data_files" + + // These SNPs are taken from the meta-analyses of Genome-Wide Association Studies (GWAS) created by the GIANT consortium + //https://portals.broadinstitute.org/collaboration/giant/index.php/GIANT_consortium_data_files + + // Download link: + // https://portals.broadinstitute.org/collaboration/giant/images/0/09/PublicRelease.WHRadjBMI.C.All.Add.txt.gz + + // SHA-256 Checksum: + // 2a863b0357037ae5c34853342052ed3c59735d6440da0fd15d1cab34b7d49daf + + // See /utilities/extractGiantLoci/extractGiantLoci.go to see how they were extracted from the file + + buffer := bytes.NewBuffer(GiantObesityStudyLociFile) + decoder := gob.NewDecoder(buffer) + + var lociList_1 []int64 + + err := decoder.Decode(&lociList_1) + if (err != nil){ return PolygenicDisease{}, err } + + for _, rsID := range lociList_1{ + locusReferencesMap[rsID] = maps.Clone(referencesMap_List1) + } + + obesityLociList := helpers.GetListOfMapKeys(locusReferencesMap) + + referencesMap := make(map[string]string) + referencesMap["Obesity Genome-Wide Association Study (GWAS) created by the GIANT consortium"] = "https://portals.broadinstitute.org/collaboration/giant/index.php/GIANT_consortium_data_files" + + getAverageRiskProbabilitiesFunction := func(maleOrFemale string, inputAge int)(float64, error){ + + // Roughly 30% of people are obese. + + if (maleOrFemale == "Male"){ + return 0.30, nil + } + + if (maleOrFemale != "Female"){ + return 0, errors.New("Trying to get breast cancer risk probability for invalid maleOrFemale: " + maleOrFemale) + } + + //TODO: Add different probabilities per age + + return 0.30, nil + } + + obesityObject := PolygenicDisease{ + DiseaseName: "Obesity", + EffectedSex: "Both", + DiseaseDescription: "The condition of having an excessive amount of body fat.", + LocusReferencesMap: locusReferencesMap, + LociList: obesityLociList, + GetAverageRiskProbabilitiesFunction: getAverageRiskProbabilitiesFunction, + References: referencesMap, + } + + return obesityObject, nil +} + + diff --git a/resources/geneticReferences/polygenicDiseases/polygenicDiseases.go b/resources/geneticReferences/polygenicDiseases/polygenicDiseases.go index bef6697..1564cb3 100644 --- a/resources/geneticReferences/polygenicDiseases/polygenicDiseases.go +++ b/resources/geneticReferences/polygenicDiseases/polygenicDiseases.go @@ -47,12 +47,15 @@ var polygenicDiseaseNamesList []string var polygenicDiseaseObjectsList []PolygenicDisease // This must be called once during application startup -func InitializePolygenicDiseaseVariables(){ +func InitializePolygenicDiseaseVariables()error{ breastCancerObject := getBreastCancerDiseaseObject() autismObject := getAutismDiseaseObject() - polygenicDiseaseObjectsList = []PolygenicDisease{breastCancerObject, autismObject} + obesityObject, err := getObesityDiseaseObject() + if (err != nil) { return err } + + polygenicDiseaseObjectsList = []PolygenicDisease{breastCancerObject, autismObject, obesityObject} polygenicDiseaseNamesList = make([]string, 0, len(polygenicDiseaseObjectsList)) @@ -62,6 +65,8 @@ func InitializePolygenicDiseaseVariables(){ polygenicDiseaseNamesList = append(polygenicDiseaseNamesList, diseaseName) } + + return nil } // Be aware that all of these functions are returning original objects/slices, not copies diff --git a/resources/geneticReferences/polygenicDiseases/rsIDs/GiantObesityStudyLoci.gob b/resources/geneticReferences/polygenicDiseases/rsIDs/GiantObesityStudyLoci.gob new file mode 100644 index 0000000000000000000000000000000000000000..9cde1a2715a70054c0d8638a93221b4c0dfd2f77 GIT binary patch literal 5019 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�$1{4cC zdZ3AKs$j2vV>fTkI0(gr&uMF=o%T>Hb>n?apT6YI9tL#h3onW(bUCayOyr`yLwgD5 z0~=EKcm?;69AI!*7ey+Jq`St}GlDJM!=U`~IisO%4RfIPrUzv|y$Dir6IpQQ_+DN* zrPF(Vn+;LT*+sq;IvV2OwL}{0<^b|W&LN%;$f_4(tLYJU$feYXXg;eYkG+d*NEFw0 zC@j8bpAQ7>qJG}uMi@4Q&$h7Li#JF*35TRSzApE=!LM|yAMsmBJ zC7|JDy-L$0s8LS816^B~9P#4F9i#X z7SuxQQ&3AUwsViBU`GGRE3}V(r5U-Fz|d&A6$>BtECP^rx*W;_4!dCJ-W&si|3eFe zFCStAf8CQV9x{d9b-a9<$##)OcOtcfhCx!x)o*#hEGuLs^ZTg-RCy!E!}q9S3Mpk( z34^632^JUSiKOzs^w(<%0nmNfL>Z)=CG~2~l=oeZB2#Ymai&&|C69)-l``E9RWlKG zv%^o8sh|q4?}YT==TdTTR3sE5Zo6|tds+wyIWytwf5i#fyXFk{7083ZI60O3>{UZJ zM^aydjx2-zY?g*y`jt3c{fzypd*v?iZ0LpCjvO}V+2?=V#qKy-QROzu zP1V9Pifs(5*Iihj=>mSnkTiJgI|4C5V@D7yDIUd&dMFluy^8vJ8ArF5%!S_CAraEi zArw^Cc`r!kY6Ds2TV(u?J|X<RsG11tkeXIvlI%+Ro=h+5jpih_ zu{Z{bRd#f_OW6d=yM@EELrOe+N6d;L2q&Z9=irv|YWJz4M7F_}=9u3H74@j=@d6iRmOc{Ug5m=?y%(rU_0d4b{lQ75Ipp5~~W z7|mIA>@sM7*_uG`##lf&^pA&O-=GRacvWU{$QWkI-fyksDu3RE!uZ1X5YmisY((HG z4gmQi_QG#eu(8?A`yLoE>Xz_zPP`eP&DY2wRCrA^|2!?o;=$vY4MxKnp)B6*O?U30?5AyR(l^kGuw%ob1ehSa_J1U;dMdfmUzyYJ0)q^06`9`vExBoa(E zgE*SZ_62>&^E?|)MW3I>mFjbo_xy$FXB6j!XF}Rhzk!j zp$r!HM}U&6-~erX-U9lYMZ2IZX`q8ydT`{sU&V0qiS>Z>wCNWJuOC;b^D=_8@4Q)G zj{`L!BH7FeyU`FyX-;&GVK*qd${j>4jc2j7)Hjw}wxxIXKyUt3>_H{yMS41jQU1QLeOu7i+uC#&Q z+)N%QYoiB8pX6T7X>Tydw6?j>9{po9Gva0s{V|lcxGz!@D{V0IpuCx07?;7y?*&1O zb&H2;=)N)*-AFb+x^f!&PhPP6U-cP$?E6I6q#k2)_B_sqs>_;YZyQL`w#jXtx)3shp%S)!d`V6uL3 zgRjJVn^nD5>&ss)J|%eluEeHnrPUWuPK4} z@sDm!yd(MFha+=%$j>>)+jl3>PVVGDTD7wb;)YrWVf1Pwq*Ht2;F~CGVCw$V1>)Vq zr{LSMFabX8Ui=Bby`UbN+_puLbdeQ znb7_{l4Vu9pJB+@RMSYe6W{h)lB?>I4A>0*n6YGk+miG81@6% z6vRS*?lBowv5eqVe@8Fduq2Y*)sszUKA@oP1tikm+b+ /resources/geneticReferences/traits/rsIDs +// -Obesity -> /resources/geneticReferences/polygenicDiseases/rsIDs // The loci metadata for loci from these files is also imported into the locusMetadata package to enable them to be used in Seekia package main -// Here is the file I used to extract causal rsIDs for height -// Download link: -// https://portals.broadinstitute.org/collaboration/giant/images/4/4e/GIANT_HEIGHT_YENGO_2022_GWAS_SUMMARY_STATS_ALL.gz +// Here are the files I used to extract causal rsIDs -//SHA-256 Checksum: +// Trait: Height +// Download Link: +// https://portals.broadinstitute.org/collaboration/giant/images/4/4e/GIANT_HEIGHT_YENGO_2022_GWAS_SUMMARY_STATS_ALL.gz +// SHA-256 Checksum: // db18859724675f2f9ba86eff28cb4dacac0629c0b25c9806a6cf2eed6bb8b71e +// Trait: Obesity (Waist-to-hip-ratio) +// Download Link: +// https://portals.broadinstitute.org/collaboration/giant/images/0/09/PublicRelease.WHRadjBMI.C.All.Add.txt.gz +// SHA-256 Checksum: +// 2a863b0357037ae5c34853342052ed3c59735d6440da0fd15d1cab34b7d49daf + + import "seekia/resources/geneticReferences/locusMetadata" import "seekia/resources/geneticReferences/modifyLocusMetadata" @@ -40,9 +50,14 @@ func main(){ extractGiantLoci := func()error{ - fileBytes, err := os.ReadFile("./GiantHeightStudy.txt") - if (err != nil) { - return errors.New("Could not open GiantHeightStudy.txt file: " + err.Error()) +// heightOrObesity := "Height" + heightOrObesity := "Obesity" + + filepath := "./Giant" + heightOrObesity + "Study.txt" + + fileBytes, err := os.ReadFile(filepath) + if (err != nil){ + return errors.New("Could not open " + filepath + ": " + err.Error()) } fileReader := bytes.NewReader(fileBytes) @@ -51,11 +66,11 @@ func main(){ // We first read the header line - //These are the columns of the file: + //These are the columns of the Height file: - // COLUMN DESCRIPTION FOR FILE NAMED GIANT_HEIGHT_YENGO_2022_GWAS_SUMMARY_STATS_*.gz + // Filename: GIANT_HEIGHT_YENGO_2022_GWAS_SUMMARY_STATS_*.gz // - SNPID - // -represented as CHR:POS:REF:ALT) + // -represented as CHR:POS:REF:ALT // - RSID // -RS NUMBER, WHEN AVAILABLE // - CHR @@ -82,6 +97,22 @@ func main(){ // - N // -Total sample size used in the GWAS analysis + // These are the columns of the Obesity (WHR) File: + // Filename: PublicRelease.WHRadjBMI.C.All.Add.txt.gz + // + // -1. snpname - dbSNP rsID + // -2. chr - chromosome + // -3. pos - position + // -4. markername - chr:pos + // -5. ref - reference allele (hg19 + strand) + // -6. alt - alternate allele (hg19 + strand) + // -7. beta - beta + // -8. se - standard error + // -9. pvalue - P value + // -10. n - sample size + // -11. gmaf/eur_maf - alternate allele frequency in 1000 Genome Combined/European Ancestries + // -12. exac_maf/exac_nfe_maf -alternate allele frequency in ExAC Combined/Non-Finnish European Ancestries + _, err = bufioReader.ReadString('\n') if (err != nil) { return err } @@ -91,7 +122,7 @@ func main(){ Effect float64 } - rsidsInfoMap := make(map[int64]LocusInfo) + lociInfoMap := make(map[int64]LocusInfo) for { @@ -102,58 +133,132 @@ func main(){ // We have reached the end of the file break } + // File is corrupt return errors.New("Error reading file: " + err.Error()) } lineElementsSlice := strings.Split(string(rsidInfoLine), "\t") - rsidString := lineElementsSlice[1] - rsidChromosomeString := lineElementsSlice[2] - rsidPositionString := lineElementsSlice[3] - rsidEffectString := lineElementsSlice[7] + //Outputs: + // -bool: Locus information is available + // -int64: Locus rsID + // -int: Locus Chromosome + // -int: Locus Position + // -float64: Locus effect + // -error + getLocusInfo := func()(bool, int64, int, int, float64, error){ - rsidWithoutPrefix, prefixFound := strings.CutPrefix(rsidString, "rs") - if (prefixFound == false){ - // Some of the rsIDs are not formatted in the "rs123456" format - // We skip those - //log.Println("rs prefix not found in rsID: " + rsIDString) + if (heightOrObesity == "Height"){ + + rsidString := lineElementsSlice[1] + locusChromosomeString := lineElementsSlice[2] + locusPositionString := lineElementsSlice[3] + locusEffectString := lineElementsSlice[7] + + rsidWithoutPrefix, prefixFound := strings.CutPrefix(rsidString, "rs") + if (prefixFound == false){ + // Some of the rsIDs are not formatted in the "rs123456" format + // We skip those + // log.Println("rs prefix not found in rsID: " + rsidString) + return false, 0, 0, 0, 0, nil + } + + rsID, err := helpers.ConvertStringToInt64(rsidWithoutPrefix) + if (err != nil){ + return false, 0, 0, 0, 0, errors.New("RSID is invalid: " + err.Error()) + } + + locusChromosome, err := helpers.ConvertStringToInt(locusChromosomeString) + if (err != nil){ + return false, 0, 0, 0, 0, errors.New("Locus Chromosome is invalid: " + err.Error()) + } + + locusPosition, err := helpers.ConvertStringToInt(locusPositionString) + if (err != nil){ + return false, 0, 0, 0, 0, errors.New("Locus Position is invalid: " + err.Error()) + } + + locusEffectRaw, err := helpers.ConvertStringToFloat64(locusEffectString) + if (err != nil) { + if (locusEffectString == ""){ + // The database has at least 1 entry with no effect provided + return false, 0, 0, 0, 0, nil + } + return false, 0, 0, 0, 0, errors.New("RSID effect is invalid: " + err.Error()) + } + + return true, rsID, locusChromosome, locusPosition, locusEffectRaw, nil + } + + rsidString := lineElementsSlice[0] + locusChromosomeString := lineElementsSlice[1] + locusPositionString := lineElementsSlice[2] + locusEffectString := lineElementsSlice[6] + + if (rsidString == "-" || rsidString == ""){ + return false, 0, 0, 0, 0, nil + } + + rsidWithoutPrefix, prefixFound := strings.CutPrefix(rsidString, "rs") + if (prefixFound == false){ + return false, 0, 0, 0, 0, errors.New("Obesity GWAS file contains invalid rsID: " + rsidString) + } + + rsID, err := helpers.ConvertStringToInt64(rsidWithoutPrefix) + if (err != nil){ + return false, 0, 0, 0, 0, errors.New("RSID is invalid: " + err.Error()) + } + + locusChromosome, err := helpers.ConvertStringToInt(locusChromosomeString) + if (err != nil){ + + if (locusChromosomeString == "X"){ + // TODO: Add the ability to read these chromosomes + return false, 0, 0, 0, 0, nil + } + + return false, 0, 0, 0, 0, errors.New("Locus Chromosome is invalid: " + err.Error()) + } + + locusPosition, err := helpers.ConvertStringToInt(locusPositionString) + if (err != nil){ + + hasSuffix := strings.HasSuffix(locusPositionString, "+08") + if (hasSuffix == true){ + // This is an invalid entry in the file + return false, 0, 0, 0, 0, nil + } + return false, 0, 0, 0, 0, errors.New("Locus Position is invalid: " + err.Error()) + } + + locusEffectRaw, err := helpers.ConvertStringToFloat64(locusEffectString) + if (err != nil) { + return false, 0, 0, 0, 0, errors.New("RSID effect is invalid: " + err.Error()) + } + + return true, rsID, locusChromosome, locusPosition, locusEffectRaw, nil + } + + locusInfoExists, locusRSID, locusChromosome, locusPosition, locusEffectRaw, err := getLocusInfo() + if (err != nil) { return err } + if (locusInfoExists == false){ continue } - rsID, err := helpers.ConvertStringToInt64(rsidWithoutPrefix) - if (err != nil){ - return errors.New("RSID is invalid: " + err.Error()) - } - - rsidChromosome, err := helpers.ConvertStringToInt(rsidChromosomeString) - if (err != nil){ return err } - - rsidPosition, err := helpers.ConvertStringToInt(rsidPositionString) - if (err != nil){ return err } - - rsidEffectRaw, err := helpers.ConvertStringToFloat64(rsidEffectString) - if (err != nil) { - if (rsidEffectString == ""){ - // The database has at least 1 entry with no effect provided - continue - } - return err - } - // Effect can be negative, we make it positive - rsidEffect := math.Abs(rsidEffectRaw) + locusEffect := math.Abs(locusEffectRaw) - existingLocusValue, exists := rsidsInfoMap[rsID] + existingLocusValue, exists := lociInfoMap[locusRSID] if (exists == false){ newLocusInfo := LocusInfo{ - Chromosome: rsidChromosome, - Position: rsidPosition, - Effect: rsidEffect, + Chromosome: locusChromosome, + Position: locusPosition, + Effect: locusEffect, } - rsidsInfoMap[rsID] = newLocusInfo + lociInfoMap[locusRSID] = newLocusInfo } else { // We see if the effect of this allele is greater @@ -165,24 +270,24 @@ func main(){ existingPosition := existingLocusValue.Position existingEffect := existingLocusValue.Effect - if (existingChromosome != rsidChromosome){ + if (existingChromosome != locusChromosome){ return errors.New("GIANT gwas contains two rsIDs with conflicting chromosomes.") } - if (existingPosition != rsidPosition){ + if (existingPosition != locusPosition){ return errors.New("GIANT gwas contains two rsIDs with conflicting positions.") } - if (existingEffect < rsidEffect){ + if (existingEffect < locusEffect){ // We update the value with the new effect - existingLocusValue.Effect = rsidEffect - rsidsInfoMap[rsID] = existingLocusValue + existingLocusValue.Effect = locusEffect + lociInfoMap[locusRSID] = existingLocusValue } } } // We find the top 10,000 rsIDs with the greatest effect - rsidsList := helpers.GetListOfMapKeys(rsidsInfoMap) + rsidsList := helpers.GetListOfMapKeys(lociInfoMap) compareFunction := func(rsid1 int64, rsid2 int64)int{ @@ -190,14 +295,14 @@ func main(){ panic("Identical rsIDs found during sort.") } - rsid1Info, exists := rsidsInfoMap[rsid1] + rsid1Info, exists := lociInfoMap[rsid1] if (exists == false){ - panic("rsid1 is missing from rsidsInfoMap.") + panic("rsid1 is missing from lociInfoMap.") } - rsid2Info, exists := rsidsInfoMap[rsid2] + rsid2Info, exists := lociInfoMap[rsid2] if (exists == false){ - panic("rsid2 is missing from rsidsInfoMap.") + panic("rsid2 is missing from lociInfoMap.") } rsid1Effect := rsid1Info.Effect @@ -225,17 +330,16 @@ func main(){ for _, rsID := range mostImpactfulLoci{ - locusInfo, exists := rsidsInfoMap[rsID] + locusInfo, exists := lociInfoMap[rsID] if (exists == false){ - return errors.New("rsidsInfoMap missing rsID.") + return errors.New("lociInfoMap missing rsID.") } locusChromosome := locusInfo.Chromosome locusPosition := locusInfo.Position - locusReferencesMap := map[string]string{ - "Height Genome-Wide Association Study (GWAS) created by the GIANT consortium": "https://portals.broadinstitute.org/collaboration/giant/index.php/GIANT_consortium_data_files", - } + locusReferencesMap := make(map[string]string) + locusReferencesMap[heightOrObesity + " Genome-Wide Association Study (GWAS) created by the GIANT consortium"] = "https://portals.broadinstitute.org/collaboration/giant/index.php/GIANT_consortium_data_files" newLocusMetadata := locusMetadata.LocusMetadata{ RSIDsList: []int64{rsID}, @@ -251,12 +355,16 @@ func main(){ locusMetadatasToAddList = append(locusMetadatasToAddList, newLocusMetadata) } + // We add the locus metadatas + _, newLocusMetadataFileBytes, err := modifyLocusMetadata.AddLocusMetadata(locusMetadatasToAddList) if (err != nil) { return err } err = localFilesystem.CreateOrOverwriteFile(newLocusMetadataFileBytes, "./", "NewLocusMetadata.gob") if (err != nil){ return err } + // We create the rsIDs list file + buffer := new(bytes.Buffer) gobEncoder := gob.NewEncoder(buffer) @@ -266,7 +374,9 @@ func main(){ encodedBytes := buffer.Bytes() - err = localFilesystem.CreateOrOverwriteFile(encodedBytes, "./", "GiantHeightStudyLoci.gob") + filename := "Giant" + heightOrObesity + "StudyLoci.gob" + + err = localFilesystem.CreateOrOverwriteFile(encodedBytes, "./", filename) if (err != nil){ return err } return nil