Module:LBGA

Documentation for this module may be created at Module:LBGA/doc

local getArgs = require('Module:Arguments').getArgs;
local defArgs = require('Module:Arguments').defaultArgs;
local lbga = {};

function lbga.RegisteredSpecies( frame )
  local args = defArgs(getArgs(frame), 1, "");
  local arg = args[1];

  isIn = {} T = {}
  for ref, sp, id in arg:gmatch("&?&?([%w\. ]+)&&([%w]+)[%w\., ]*&&([^\n]+)") do
    if (isIn[sp] == nil) then isIn[sp] = true table.insert(T, sp) end
  end
  table.sort(T)
  s = ""
  for i,v in pairs(T) do
    s = s .. "{{#volatile:ListMolByReference|" .. v .. "|" .. v .. "}} "
  end
  return frame:preprocess(s)
end

local function createBucket()
  return { {A={},C={} },{ N={},I={} },{ G={},X={} } }
end

local function printRow(name, T, reg)
  local r;
  if (string.find(name, "cenarchaea") ~= nil)
    then r = '\n&- align="right" style="background-color:#fa3"';
  elseif (string.find(name, "halobacter") ~= nil)
    then r = '\n&- align="right" style="background-color:#ddf"';
  elseif (string.find(name, "methano") == nil)
    then r = '\n&- align="right" style="background-color:#fdd"';
  else
    r = '\n&- align="right"';
  end

  if (string.find(name, "cenarchaeales") ~= nil)
    then r = r .. '\n! rowspan="1" style="background-color:#ddd" & <b>thaumarchaeota</b>'; end
  if (string.find(name, "desulfurococcales") ~= nil)
    then r = r .. '\n! rowspan="3" style="background-color:#ddd" & <b>crenarchaeota</b>'; end
  if (string.find(name, "thermococcales") ~= nil)
    then r = r .. '\n! rowspan="8" style="background-color:#ddd" & <b>euryarchaeota</b>'; end

  r = r .. "\n& {{#volatile:ListMolByReference|"..name.."|"..reg.."}} && ";
  r = r .. table.getn(T[1]["A"]).."\n&&"..table.getn(T[1]["C"]).."\n&&";
    T[1]["A"] = nil;
    T[1]["C"] = nil;
  for k,v in pairs(T[1]) do
    r = r .. k.."("..table.getn(v)..") ";
  end
  r = r .. " && ";
  r = r .. table.getn(T[2]["N"]).."\n&&"..table.getn(T[2]["I"]).."\n&&";
    T[2]["N"] = nil;
    T[2]["I"] = nil;
  for k,v in pairs(T[2]) do
    r = r .. k.."("..table.getn(v)..") ";
  end
  r = r .. " && ";
  r = r .. table.getn(T[3]["G"]).."\n&&"..table.getn(T[3]["X"]).."\n&&";
    T[3]["G"] = nil;
    T[3]["X"] = nil;
  for k,v in pairs(T[3]) do
    r = r .. k.."("..table.getn(v)..") ";
  end

  return r;
end

local function addTable(T, id)
  exist = false
  for k,v in pairs(T) do if (id == v) then exist = true end end
  if (not exist) then table.insert(T, id) end
end
  
local function register(T, id)
  local s = string.sub(id,5,5)
  if (T[1][s] == nil) then T[1][s] = {} end addTable(T[1][s], id)
  s = string.sub(id,6,6)
  if (T[2][s] == nil) then T[2][s] = {} end addTable(T[2][s], id)
  s = string.sub(id,8,8)
  if (T[3][s] == nil) then T[3][s] = {} end addTable(T[3][s], id)
end

function lbga.Species2Structure_Relationship( frame )
  local args = defArgs(getArgs(frame), 1, "");
  local arg = args[1];
  local r = "";

  cenarchaeales      = createBucket()
  desulfurococcales  = createBucket()
  sulfolobales       = createBucket()
  thermoproteales    = createBucket()
  thermococcales     = createBucket()
  thermoplasmatales  = createBucket()
  halobacteriales    = createBucket()
  methanobacteriales = createBucket()
  methanococcales    = createBucket()
  methanomicrobiales = createBucket()
  methanopyrales     = createBucket()
  methanosarcinales  = createBucket()

  for ref, sp, id in arg:gmatch("&?&?([%w\. ]+)&&([%w]+)[%w\., ]+&&([^\n]+)") do
    if (string.match(sp,"Cenarchaeum") or string.find(sp,"Nitroso") or string.match(sp,"Giganthauma"))
      then register(cenarchaeales, id)
    elseif (string.match(sp,"Aeropyrum") or string.match(sp,"Desulfurococcus") or string.match(sp,"Pyrolobus"))
      then register(desulfurococcales, id)
    elseif (string.match(sp,"Acidianus") or string.match(sp,"Sulfolobus") or string.match(sp,"Desulfurolobus"))
      then register(sulfolobales, id)
    elseif (string.match(sp,"Pyrobaculum") or string.match(sp,"Thermoproteus"))
      then register(thermoproteales, id)
    elseif (string.match(sp,"Pyrococcus") or string.match(sp,"Thermococcus"))
      then register(thermococcales, id)
    elseif (string.match(sp,"Thermoplasma"))
      then register(thermoplasmatales, id)
    elseif (string.match(sp,"Haloarcula") or string.match(sp,"Halobacterium") or string.match(sp,"Halococcus") or string.match(sp,"Haloferax") or string.match(sp,"Halorubrum") or string.match(sp,"Natrialba") or string.match(sp,"Natronobacterium") or string.match(sp,"Natronococcus") or string.match(sp,"Halarchaeum"))
      then register(halobacteriales, id)
    elseif (string.match(sp,"Methanothermobacter") or string.match(sp,"Methanobrevibacter") or string.match(sp,"Methanosphaera") or string.match(sp,"Methanothermobacter"))
      then register(methanobacteriales, id)
    elseif (string.match(sp,"Methanothermococcus") or string.match(sp,"Methanococcus") or string.match(sp,"Methanocaldococcus"))
      then register(methanococcales, id)
    elseif (string.match(sp,"Methanomicrobium") or string.match(sp,"Methanospirillum"))
      then register(methanomicrobiales, id)
    elseif (string.match(sp,"Methanopyrus"))
      then register(methanopyrales, id)
    elseif (string.match(sp,"Methanococcoides") or string.match(sp,"Methanohalophilus") or string.match(sp,"Methanolobus") or string.match(sp,"Methanosarcina"))
      then register(methanosarcinales, id)
    end
  end

  r = r .. printRow("cenarchaeales", cenarchaeales, "Cenarchaeum~Nitroso~Giganthauma")
  r = r .. printRow("desulfurococcales", desulfurococcales, "Aeropyrum~Desulfurococcus~Pyrolobus")
  r = r .. printRow("sulfolobales",sulfolobales, "Acidianus~Sulfolobus~Desulfurolobus")
  r = r .. printRow("thermoproteales",thermoproteales, "Pyrobaculum~Thermoproteus")
  r = r .. printRow("thermococcales",thermococcales, "Pyrococcus~Thermococcus")
  r = r .. printRow("thermoplasmatales",thermoplasmatales, "Thermoplasma")
  r = r .. printRow("halobacteriales",halobacteriales, "Haloarcula~Halobacterium~Halococcus~Haloferax~Halorubrum~Natrialba~Natronobacterium~Natronococcus~Halarchaeum")
  r = r .. printRow("methanobacteriales",methanobacteriales, "Methanothermobacter~Methanobrevibacter~Methanosphaera")
  r = r .. printRow("methanococcales",methanococcales, "Methanothermococcus~Methanococcus~Methanocaldococcus")
  r = r .. printRow("methanomicrobiales",methanomicrobiales, "Methanomicrobium~Methanospirillum")
  r = r .. printRow("methanopyrales",methanopyrales, "Methanopyrus")
  r = r .. printRow("methanosarcinales",methanosarcinales, "Methanococcoides~Methanohalophilus~Methanolobus~Methanosarcina")

  return frame:preprocess(r);
end

local function createTable(T, title, Tp, Ts) 
  local text = '==' .. title .. '==\n{& class="wikitable sortable"\n! ID && Polar group<br/><small>Gro: glycerol </small> && Sugar group<br/><small>Glc: glucose Gul: gulose</small>'
  for k,v in ipairs(T) do
    s = "\n&-\n& [[" .. v .. "]] && "
    if (Tp[v] ~= nil) then s = s .. Tp[v] end
    s = s .. " && "
    if (Ts[v] ~= nil) then s = s .. Ts[v] end
    text = text .. s
  end
  text = text .. "\n&}\n"

  return text
end

function lbga.GroupTable( frame )
  local args = defArgs(getArgs(frame), 1, "");
  local arg = args[1];

  local Tp = {}
  local Ts = {}
  local S0 = {}; S1 = {}; S2= {}; S3 = {}
  local dup = {}
  local text = ""

  for id, group, seq in arg:gmatch("&&([^\n]+)|([%w]+)Group=([^\n]+)") do
    if (string.match(group,"Polar")) then Tp[id] = seq end
    if (string.match(group,"Sugar")) then Ts[id] = seq end
    d = 0
    for k,v in ipairs(dup) do
      if (string.match(id, v)) then
        d = 1
        break
      end
    end
    table.insert(dup, id)
    if (d == 0) then
      s = string.sub(id,7,7)
      if (s == "0") then table.insert(S0, id)
      elseif (s == "1") then table.insert(S1, id)
      elseif (s == "2") then table.insert(S2, id)
      else table.insert(S3, id) end
    end
  end

  text = createTable(S0, "No Sugar", Tp, Ts)
  text = text .. createTable(S1, "One Sugar <small>including inositol</small>", Tp, Ts)
  text = text .. createTable(S2, "Two Sugars <small>including inositol</small>", Tp, Ts)
  text = text .. createTable(S3, "Three or more <small>including inositol</small>", Tp, Ts)

  return text
end

return lbga