Re: most ChemicalData molecule plots missing? [solved]
- To: mathgroup at smc.vnet.net
- Subject: [mg96740] Re: [mg96163] most ChemicalData molecule plots missing? [solved]
- From: Mitch Murphy <mitch at lemma.ca>
- Date: Mon, 23 Feb 2009 05:03:18 -0500 (EST)
- References: <499F3178.3080600@wolfram.com>
On Feb 07, 2009, at 03:52, Mitch Murphy wrote:
> i'm getting a lot of missing molecule plots for even the simplest and
> most common molecules in ChemicalData[]...
>
> most hydrocarbons are also missing.
>
> is this normal, or could there be something wrong with my mathematica
> install or a cached curated data problem?
>
> i was expecting molecule plots to be automatically generated from the
> chemical formulas, but looks like it's not. i guess its down to
> manually using graphics3d, spheres, and cylinders ...
>
i wrote the following ElementPlot3D and MoleculePlot3D functions which
automatically generate the molecule plot based on
ElementData[atom, "AtomicRadius"]
ElementData[atom, "Abbreviation"]
ChemicalData[chem, "AtomPositions"]
ChemicalData[chem, "VertexCoordinates"]
ChemicalData[chem, "VertexTypes"]
ChemicalData[chem, "EdgeRules"]
my code uses VertexCoordinates if AtomPositions is missing, but does
not handle both missing. another potential improvement would be to
have double/triple edge rules where applicable (all bonds are drawn as
a single tube in my code).
cheers,
Mitch
-------------------------
ElementPlot3D[atom_, {x_: 0, y_: 0}] := Module[{radius},
radius = ElementData[atom, "AtomicRadius"];
{ElementData[atom, "IconColor"], Sphere[{x, y, 0}, .4 radius],
Black,
Style[Text[ElementData[atom, "Abbreviation"], {x, y, .4 radius}],
FontSize -> 12]}
]
ElementPlot3D[atom_, {x_: 0, y_: 0, z_: 0}] := Module[{radius},
radius = ElementData[atom, "AtomicRadius"];
{Darker@ElementData[atom, "IconColor"], Sphere[{x, y, z}, .5 radius]}
]
MoleculePlot3D[chem_,
opts : OptionsPattern[{ImageSize -> 200, Frame -> True}]] := Module[
{atomCoordinates, atomTypes, atomColors, atomGraphics, edgeRules,
edgeGraphics},
atomCoordinates = ChemicalData[chem, "AtomPositions"]
/. _Missing -> ChemicalData[chem, "VertexCoordinates"];
atomTypes = ChemicalData[chem, "VertexTypes"];
edgeRules = ChemicalData[chem, "EdgeRules"];
edgeGraphics = Table[Tube[{
If[Length@First@atomCoordinates > 2,
atomCoordinates[[edgeRules[[i, 1]]]],
Append[atomCoordinates[[edgeRules[[i, 1]]]], 0]],
If[Length@First@atomCoordinates > 2,
atomCoordinates[[edgeRules[[i, 2]]]],
Append[atomCoordinates[[edgeRules[[i, 2]]]], 0]]
}, 4,
VertexColors ->
Evaluate[
ElementData[#, "IconColor"] & /@
atomTypes[[{edgeRules[[i, 1]], edgeRules[[i, 2]]}]]]],
{i, Length@edgeRules}];
atomGraphics = Table[ElementPlot3D[atomTypes[[i]],
atomCoordinates[[i]]],
{i, Length@atomCoordinates}];
Graphics3D[{Thick, edgeGraphics, atomGraphics}, Boxed -> False,
ViewPoint -> Top,
Background -> GrayLevel@.9, ImagePadding -> 20, ImageSize ->
{400, 280},
Lighting -> "Neutral"]
]
GraphicsRow[{MoleculePlot3D@"CarbonDioxide", MoleculePlot3D@"Ethanol"},
ImageSize -> 500]