(* Sorting names *)
synonymOf[_] := {};
maintainSort := (
Print["Sorting names ..."];
namesData =
Table[
If[
addNameData[name, "ifexists"] === True,
kingdom = addNameData[name, "kingdom"];
phylum = addNameData[name, "phylum"];
class = addNameData[name, "class"];
order = addNameData[name, "order"];
family = addNameData[name, "family"];
sciname = addNameData[name, "fullname"];
synonyms = addNameData[name, "synonyms"];
link = addNameData[name, "link"],
key = nameKey[name];
If[key == 0,
Print["Error: key = 0: name: ", name]];
kingdom = keyData[key, "kingdom"];
phylum = keyData[key, "phylum"];
class = keyData[key, "class"];
order = keyData[key, "order"];
family = keyData[key, "family"];
sciname = keyData[key, "scientificName"];
synonyms = keyData[key, "synonyms"];
link = keyData[key, "link"]];
Clear[x];
match = x : matchName2 ~~ ___;
synonyms = If[Head[synonyms] === List, synonyms, {}];
synonyms = Select[synonyms, StringMatchQ[#, match]&];
synonyms = StringReplace[#, match :> x] &/@ synonyms;
synonyms = Union[Complement[synonyms, {name}]];
(*
type = If[phylum === "Ascomycota" &&
MemberQ[{"Arthoniomycetes", "Candelariomycetes", "Dothideomycetes", "Lecanoromycetes", "Eurotiomycetes"},
class], "lichen",
If[kingdom === "Protozoa", "slime mold",
If[kingdom === "Fungi", "mushroom",
"unknown"]]];
*)
type = "unknown";
If[phylum === "Ascomycota",
type = If[MemberQ[{"Arthoniomycetes", "Candelariomycetes", "Dothideomycetes", "Lecanoromycetes", "Eurotiomycetes"}, class], "lichen", "Ascomycota"];
];
If[phylum === "Basidiomycota", type = "Basidiomycota"];
If[phylum === "Zygomycota", type = "Zygomycota"];
If[phylum === "Oomycota", type = "Oomycota"];
If[phylum === "Chytridiomycota", type = "Chytridiomycota"];
If[kingdom === "Protozoa", type = "slime mold"];
(* Correcting false instances of lichens, like Catinella olivacea *)
If[type === "lichen",
set = picSet[name];
nset = Length[set];
setm = mushroomsPic @@ # & /@ set;
setm01 = Select[
setm, (Intersection[#, matchLichen] =!= {} &&
Intersection[#, matchFungus] === {}) &];
nset01 = Length[setm01];
If[nset01 ==0,
Print["Selecting lichens: it seems that ", name, " is not a lichen. Assigning it to fungi. Set: ", set];
type = "Ascomycota";
];
];
typereplace = {"Ascomycota" -> 1, "Basidiomycota" -> 2, "Chytridiomycota" -> 3, "Zygomycota" -> 4, "Oomycota" -> 5, "lichen" -> 6, "slime mold" -> 7, "unknown" -> 99};
itype = Replace[type, typereplace];
(* sciname = StringReplace[sciname, StartOfString ~~ x:Longest[matchName2] :> "" <> x <> ""]; *)
sciname3 = StringSplit[sciname, " ", 3];
If[Length[sciname3] == 3,
sciname = {"" <> sciname3[[1]], sciname3[[2]] <> "",
sciname3[[3]]};
sciname = StringRiffle[sciname],
Print["Warning: sciname too short: ", sciname];
];
system = {itype, kingdom, phylum, class, order, family, name, type, sciname, synonyms, link};
system = system /. {"Undefined" -> "zzzUndefined"};
If[Head[synonyms] === List,
nameSynonyms[name] = synonyms;
Do[synonymOf[synonym] = Append[synonymOf[synonym], name], {synonym, synonyms}];
];
{system, name}, {name, accNamesList}];
namesData = Sort[namesData];
namesListSort = #[[2]] & /@ namesData;
(* List of families *)
familyList = #[[1, 6]] &/@ namesData;
familyList = Union[familyList];
familyList = Select[familyList, (# =!= "zzzUndefined")&];
Print[Length[namesListSort], " accepted names."];
Print[Length[familyList], " families."];
allSynonyms = Union[Flatten[Table[
nameSynonyms[name], {name, accNamesList}]]];
Print[Length[allSynonyms], " synonyms"];
namesAndSynonyms = Union[accNamesList, allSynonyms];
Print[Length[namesAndSynonyms], " names and synonyms"];
ambiguousSynonyms = Select[allSynonyms, Length[synonymOf[#]] > 1 &];
Print[Length[ambiguousSynonyms], " ambiguous synonyms"];
nNames = Length[accNamesList];
nTexas = Length[picsTexas];
mPictures = Length[picsList];
nPictures = Length[Union[Join@@tmushpictures]];
Print[nNames, " mushroom names; ", nTexas, " pictures taken in Texas; ", mPictures, " pictures of mushrooms; ", nPictures, " pictures with identified mushrooms."];
);