# Module:Shindo/data

--- Data for Module:Shindo.  
-- @submodule shindo.data  
-- @alias data  

--- Makes a new seismic intensity scale from a template scale  
-- @param {table} scale existing scale  
-- @param {string} name name of new scale  
-- @param {string} id_prefix name of id prefix  
-- @param {string} short name/abbreviation of scale  
-- @return {table} new scale  
function makeFromTemplateScale(scale, name, id_prefix, short)  
local returnVal = mw.clone(scale)  
returnVal.name = name or returnVal.name  
returnVal.id_prefix = id_prefix  
returnVal.short = short  
return returnVal  
end  

--- Adds field to multiple scales  
-- @param {string} nameOfField field name  
-- @param {table} objectToWriteTo write to object  
-- @param {table} id_prefix name of id prefix  
function addField(nameOfField, objectToWriteTo, objectToReadFrom)  
for k,v in pairs(objectToWriteTo) do  
if objectToReadFrom[k] ~= nil then v[nameOfField] = objectToReadFrom[k] end  
end  
end  

local data = {}  

--- MMI and many other scales  
-- @property {table} data["mmi"]  
data["mmi"] = {  
name = "Modified Mercalli intensity scale",  
id_prefix = "mmi-",  
short = "MMI",  
colors = {  
{255, 255, 255},  
{191, 204, 255},  
{175, 217, 255},  
{160, 230, 255},  
{128, 255, 255},  
{122, 255, 147},  
{255, 255, 0},  
{255, 200, 0},  
{255, 145, 0},  
{255, 0, 0},  
{200, 0, 0},  
{164, 0, 0},  
{128, 0, 0}  
},  
order = {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII"},  
ranks = {  
["1"] = {  
id = "1",  
order = 1,  
label = "I"  
},  
["2"] = {  
id = "2",  
order = 2,  
label = "II"  
},  
["3"] = {  
id = "3",  
order = 4,  
label = "III"  
},  
["4"] = {  
id = "4",  
order = 5,  
label = "IV"  
},  
["5"] = {  
id = "5",  
order = 6,  
label = "V"  
},  
["6"] = {  
id = "6",  
order = 7,  
label = "VI"  
},  
["7"] = {  
id = "7",  
order = 8,  
label = "VII"  
},  
["8"] = {  
id = "8",  
order = 9,  
label = "VIII"  
},  
["9"] = {  
id = "9",  
order = 10,  
label = "IX"  
},  
["10"] = {  
id = "10",  
order = 11,  
label = "X"  
},  
["11"] = {  
id = "11",  
order = 12,  
label = "XI"  
},  
["12"] = {  
id = "12",  
order = 13,  
label = "XII"  
}  
}  
}  

-- Roman numeral aliases  
data["mmi"].ranks["I"] = data["mmi"].ranks["1"]  
data["mmi"].ranks["II"] = data["mmi"].ranks["2"]  
data["mmi"].ranks["III"] = data["mmi"].ranks["3"]  
data["mmi"].ranks["IV"] = data["mmi"].ranks["4"]  
data["mmi"].ranks["V"] = data["mmi"].ranks["5"]  
data["mmi"].ranks["VI"] = data["mmi"].ranks["6"]  
data["mmi"].ranks["VII"] = data["mmi"].ranks["7"]  
data["mmi"].ranks["VIII"] = data["mmi"].ranks["8"]  
data["mmi"].ranks["IX"] = data["mmi"].ranks["9"]  
data["mmi"].ranks["X"] = data["mmi"].ranks["10"]  
data["mmi"].ranks["XI"] = data["mmi"].ranks["11"]  
data["mmi"].ranks["XII"] = data["mmi"].ranks["12"]  

--- JMA, CWS, etc.  
-- @property {table} data["jma"]  
data["jma"] = {  
name = "Japan Meteorological Agency seismic intensity scale",  
id_prefix = "jma_",  
short = "JMA",  
order = {"0", "1", "2", "3", "4", "5-", "5+", "6-", "6+", "7"},  
colors = {  
{255, 255, 255},  
{242, 242, 255},  
{160, 230, 255},  
{0, 65, 255},  
{250, 230, 150},  
{255, 230, 0},  
{255, 153, 0},  
{255, 40, 0},  
{165, 0, 33},  
{180, 0, 104}  
},  
ranks = {  
["0"] = {  
id = "0",  
order = 1,  
label = "0"  
},  
["1"] = {  
id = "1",  
order = 2,  
label = "1"  
},  
["2"] = {  
id = "2",  
order = 3,  
label = "2"  
},  
["3"] = {  
id = "3",  
order = 4,  
label = "3"  
},  
["4"] = {  
id = "4",  
order = 5,  
label = "4"  
},  
["5-"] = {  
id = "5-",  
order = 6,  
label = "5−"  
},  
["5"] = {  
id = "5",  
order = 6,  
label = "5"  
},  
["5+"] = {  
id = "5+",  
order = 7,  
label = "5+"  
},  
["6-"] = {  
id = "6-",  
order = 8,  
label = "6−"  
},  
["6"] = {  
id = "6",  
order = 8,  
label = "6"  
},  
["6+"] = {  
id = "6+",  
order = 9,  
label = "6+"  
},  
["7"] = {  
id = "7",  
order = 10,  
label = "7"  
}  
}  
}  

-- @property {table} data["cwa"]  
data["cwa"] = makeFromTemplateScale(data.jma, "Central Weather Administration seismic intensity scale", "cwa_", "CWA")  
-- @property {table} data["csis"]  
data["csis"] = makeFromTemplateScale(data.mmi, "China seismic intensity scale", "csis-", "CSIS")  
-- @property {table} data["ems-98"]  
data["ems-98"] = makeFromTemplateScale(data.mmi, "European macroseismic scale", "ems-98-", "EMS-98")  
-- @property {table} data["msk-64"]  
data["msk-64"] = makeFromTemplateScale(data.mmi, "Medvedev–Sponheuer–Karnik scale", "msk-", "MSK-64")  
-- @property {table} data["rfs"]  
data["rfs"] = makeFromTemplateScale(data.mmi, "Rossi–Forel scale", "rfs-", "RFS")  
data["rfs"].ranks["11"] = nil  
data["rfs"].ranks["12"] = nil  
data["rfs"].ranks["XI"] = nil  
data["rfs"].ranks["XII"] = nil  
data["rfs"].order[12] = nil  
data["rfs"].order[11] = nil  
-- @property {table} data["peis"]  
data["peis"] = makeFromTemplateScale(data.rfs, "PHIVOLCS earthquake intensity scale", "peis-", "PEIS")  

-- ranks only present with USGS  
data["mmi"].ranks["2-3"] = {  
id = "2",  
order = 3,  
label = "II–III"  
}  

data["mmi"].ranks["II-III"] = data["mmi"].ranks["2-3"]  

data["mmi"].ranks["10+"] = {  
id = "10",  
order = 11,  
label = "X+"  
}  

data["mmi"].ranks["X+"] = data["mmi"].ranks["10+"]  

data["mmi"].order = {"I", "II", "II-III", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "X+", "XI", "XII"}  

-- Add categorical rankings to data  
addField("category", data["mmi"].ranks,  
{  
["1"] = "Not felt",  
["2"] = "Weak",  
["3"] = "Weak",  
["2-3"] = "Weak",  
["4"] = "Light",  
["5"] = "Moderate",  
["6"] = "Strong",  
["7"] = "Very strong",  
["8"] = "Severe",  
["9"] = "Violent",  
["10+"] = "Extreme",  
["10"] = "Extreme",  
["11"] = "Extreme",  
["12"] = "Extreme"  
}  

addField("category", data["ems-98"].ranks,  
{  
["1"] = "Not felt",  
["2"] = "Scarcely felt",  
["3"] = "Weak",  
["4"] = "Largely observed",  
["5"] = "Strong",  
["6"] = "Slightly damaging",  
["7"] = "Damaging",  
["8"] = "Heavily damaging",  
["9"] = "Destructive",  
["10"] = "Very destructive",  
["11"] = "Devastating",  
["12"] = "Completely devastating"  
}  

addField("category", data["msk-64"].ranks,  
{  
["1"] = "Not perceptible",  
["2"] = "Hardly perceptible",  
["3"] = "Weak",  
["4"] = "Largely observed",  
["5"] = "Fairly strong",  
["6"] = "Strong",  
["7"] = "Very strong",  
["8"] = "Damaging",  
["9"] = "Destructive",  
["10"] = "Devastating",  
["11"] = "Catastrophic",  
["12"] = "Very catastrophic"  
}  

addField("category", data["peis"].ranks,  
{  
["1"] = "Scarcely perceptible",  
["2"] = "Slightly felt",  
["3"] = "Weak",  
["4"] = "Moderately strong",  
["5"] = "Strong",  
["6"] = "Very strong",  
["7"] = "Destructive",  
["8"] = "Very destructive",  
["9"] = "Devastating",  
["10"] = "Completely devastating"  
}  

addField("category", data["rfs"].ranks,  
{  
["1"] = "Microseismic tremor",  
["2"] = "Extremely feeble tremor",  
["3"] = "Feeble tremor",  
["4"] = "Slight tremor",  
["5"] = "Moderate tremor",  
["6"] = "Strong tremor",  
["7"] = "Very strong tremor",  
["8"] = "Damaging tremor",  
["9"] = "Devastating tremor",  
["10"] = "Extremely high intensity tremor"  
}  

-- lower values for peak ground acceleration for MMI see https://usgs.github.io/shakemap/manual4_0/ug_intensity.html  
-- all values in units of %g and will need to be converted for other uses  
-- also categorization is done in buckets with averages precomputed in Excel  
---
Rank PGA listed Average for bottom buckets  
1 0.05 0.175  
2-3 0.3 1.55  
4 2.8 4.5  
5 6.2 9.1  
6 12 17  
7 22 31  
8 40 57.5  
9 75 107  
10+ 139  

--- ranks for MMI  
-- @property data["mmi"].ranks  
addField("pga", data["mmi"].ranks, {  
["1"] = 0,  
["2-3"] = 0.175,  
["4"] = 1.55,  
["5"] = 4.5,  
["6"] = 9.1,  
["7"] = 17,  
["8"] = 31,  
["9"] = 57.5,  
["10+"] = 107  
})  

data["mmi"].ranksSorted = { "1", "2-3", "4", "5", "6", "7", "8", "9", "10+" }  

-- same for JMA (values from Japan Meterological Agency seismic intensity scale and converted back to %g's)  

--- ranks for JMA  
-- @property data["jma"].ranks  
addField("pga", data["jma"].ranks, {  
["0"] = 0,  
["1"] = 0.08,  
["2"] = 0.26,  
["3"] = 0.81,  
["4"] = 2.55,  
["5-"] = 8.16,  
["5+"] = 14.29,  
["6-"] = 25.51,  
["6+"] = 32.14,  
["7"] = 40  
})  

data["jma"].ranksSorted = { "0", "1", "2", "3", "4", "5-", "5+", "6-", "6+", "7" }  

return data