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]