(* 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."]; );