@dynamic-data/ancestry-mockups
Version:
Ancestry Mockup Data Generators
156 lines (131 loc) • 3.81 kB
JavaScript
import { getRandomInt } from '@dynamic-data/utils';
import MOCK from '@dynamic-data/ancestry-data';
var allPositions = [];
var RawDataModel = {
rsid: function rsid() {
//https://www.snpedia.com/index.php?title=Category:Is_a_snp&pageuntil=Rs1004467#mw-pages
var letters = ["i", "myh", "omim", "rs"]; //100,000+ snps that fall into 4 categories
var string = "";
var letter = letters[getRandomInt(0, letters.length - 1)];
string += letter;
switch (letter) {
case "omim":
string += " 604611.0004";
break;
case "myh":
string += "6 c.2161";
break;
case "i":
string += getRandomInt(700014, 6056364);
break;
case "rs":
string += getRandomInt(1, 1008240677);
break;
}
return string;
},
chromosome: function chromosome() {
//Humans have 23 chromosomes
return getRandomInt(1, 23);
},
position: function position() {
//Over 600,000+ positions
var x;
do {
x = getRandomInt(10000000, 99999999);
} while (allPositions.includes(x));
allPositions.push(x);
return x;
},
allele1: function allele1() {
//A and T can combine with each other, C and G can combine with each other. All alleles can combine with themself
switch (getRandomInt(1, 4)) {
case 1:
return "A";
case 2:
return "T";
case 3:
return "C";
case 4:
return "G";
}
},
allele2: function allele2(allele1) {
//A and T can combine with each other, C and G can combine with each other. All alleles can combine with themself
switch (allele1) {
case "A":
case "T":
switch (getRandomInt(1, 2)) {
case 1:
return "A";
case 2:
return "T";
}
case "C":
case "G":
switch (getRandomInt(1, 2)) {
case 1:
return "C";
case 2:
return "G";
}
}
}
};
var dataModels = {
RawData: {
data: MOCK.RawDataObject,
mockup: RawDataModel
}
};
function getModelCSVHeader(dataModel) {
return dataModels[dataModel].data[0].split("\t");
}
function getRawData(dataType, dataModel, dataDate) {
var mockupData = {};
var mockupModel = dataModels[dataModel].mockup;
if (dataType === "SYNC") {
mockupData = dataModels[dataModel].data;
}
if (dataType === "ASYNC") {
var mockupDataRow = dataModels[dataModel].data[1].split("\t");
var mockupDataHeader = dataModels[dataModel].data[0].split("\t");
mockupDataHeader.forEach(function (k, i) {
mockupData[k] = mockupDataRow[i];
});
}
var exampleData = mockupData[0];
mockupData = [mockupData[0]]; //https://genomapp.com/en/dna-raw-data-format/ - 600,000-3,000,000 sites
for (var i = 0; i < 10000; i++) {
mockupData.push(Object.assign({}, exampleData));
}
mockupData.forEach(function (object) {
["rsid", "chromosome", "position", "allele1", "allele2"].forEach(function (key, i) {
switch (key) {
case "allele2":
object[key] = mockupModel[key](object["allele1"]);
break;
default:
object[key] = mockupModel[key]();
break;
}
});
}); // function quicksort(array) {
// if (array.length <= 1) {
// return array;
// }
// var pivot = array[0];
// var left = [];
// var right = [];
// for (var i = 1; i < array.length; i++) {
// array[i].position < pivot.position ? left.push(array[i]) : right.push(array[i]);
// }
// return quicksort(left).concat(pivot, quicksort(right));
// }
// mockupData = quicksort(mockupData)
// mockupData.sort((a,b)=>{
// return a.position - b.position;
// })
return mockupData;
}
export { getModelCSVHeader, getRawData };