seekia/utilities/addLocusMetadata/addLocusMetadata.go

124 lines
3.3 KiB
Go

// addLocusMetadata.go provides a function to manually add locus metadata to the .json files.
package main
import "seekia/resources/geneticReferences/locusMetadata"
import "seekia/internal/helpers"
import "seekia/internal/localFilesystem"
import "encoding/json"
import "slices"
import "log"
func main(){
/*
//TODO: Add these loci
// They are on the X chromosome, and we haven't defined the syntax to deal with X chromosome loci yet.
newLocusMetadataObject_1 := locusMetadata.LocusMetadata{
RSIDsList: []int64{5957354},
Chromosome: X,
Position: 120305480,
GeneNamesList: []string{"TMEM255A"},
CompanyAliases: make(map[locusMetadata.GeneticsCompany][]string),
References: make(map[string]string),
}
newLocusMetadataObject_2 := locusMetadata.LocusMetadata{
RSIDsList: []int64{78542430},
Chromosome: X,
Position: 48259397,
GeneNamesList: []string{"SSX1"},
CompanyAliases: make(map[locusMetadata.GeneticsCompany][]string),
References: make(map[string]string),
}
*/
// This is a list of metadata objects to add to the locus metadata
lociToAddList := []locusMetadata.LocusMetadata{
//newLocusMetadataObject_1,
//newLocusMetadataObject_2,
}
numberOfLociToAdd := len(lociToAddList)
err := locusMetadata.InitializeLocusMetadataVariables()
if (err != nil){
log.Println("ERROR: " + err.Error())
return
}
// Map Structure: Chromosome -> List of locus metadata objects to add
lociToAddMap := make(map[int][]locusMetadata.LocusMetadata)
for _, locusObject := range lociToAddList{
// First we check to see if locus metadata already exists
locusRSIDsList := locusObject.RSIDsList
for _, rsID := range locusRSIDsList{
exists, _, err := locusMetadata.GetLocusMetadata(rsID)
if (err != nil){
log.Println("ERROR: " + err.Error())
return
}
if (exists == true){
rsIDString := helpers.ConvertInt64ToString(rsID)
log.Println("lociToAddList contains locus whose metadata already exists: " + rsIDString)
return
}
}
locusChromosome := locusObject.Chromosome
existingList, exists := lociToAddMap[locusChromosome]
if (exists == false){
lociToAddMap[locusChromosome] = []locusMetadata.LocusMetadata{locusObject}
} else {
existingList = append(existingList, locusObject)
lociToAddMap[locusChromosome] = existingList
}
}
for chromosomeInt, locusMetadataObjectsToAddList := range lociToAddMap{
existingLocusMetadataObjectsList, err := locusMetadata.GetLocusMetadataObjectsListByChromosome(chromosomeInt)
if (err != nil) {
log.Println(err)
return
}
newLocusMetadataObjectsList := slices.Concat(existingLocusMetadataObjectsList, locusMetadataObjectsToAddList)
newChromosomeFileBytes, err := json.MarshalIndent(newLocusMetadataObjectsList, "", "\t")
if (err != nil){
log.Println("ERROR: " + err.Error())
return
}
currentChromosomeString := helpers.ConvertIntToString(chromosomeInt)
locusMetadataFilepath := "../../resources/geneticReferences/locusMetadata/"
err = localFilesystem.CreateOrOverwriteFile(newChromosomeFileBytes, locusMetadataFilepath, "LocusMetadata_Chromosome" + currentChromosomeString + ".json")
if (err != nil){
log.Println("ERROR: " + err.Error())
return
}
}
numberOfAddedLociString := helpers.ConvertIntToString(numberOfLociToAdd)
log.Println("Successfully added " + numberOfAddedLociString + " locus metadatas!")
}