summaryrefslogtreecommitdiff
path: root/public/java/Display.java
blob: 4a3e2210eb392b4ebfc8fb7133628d247573bad0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import java.util.List;
import java.util.Arrays;
import java.util.*;
import java.io.*;

import java.awt.*;
import java.awt.image.*;
import java.awt.geom.*;

import javax.imageio.*;

import org.openscience.cdk.*;
import org.openscience.cdk.interfaces.*;
import org.openscience.cdk.layout.*;
import org.openscience.cdk.renderer.*;
import org.openscience.cdk.renderer.font.*;
import org.openscience.cdk.renderer.generators.*;
import org.openscience.cdk.renderer.visitor.*;
import org.openscience.cdk.templates.*;
import org.openscience.cdk.smiles.*;
import org.openscience.cdk.smiles.smarts.*;
import org.openscience.cdk.graph.*;
import org.openscience.cdk.geometry.*;

public class Display{

	int size;
	Rectangle drawArea;
	IMolecule molecule = new Molecule();
	IMoleculeSet moleculeSet;
	IMolecule[] coordinated_mols;
	StructureDiagramGenerator sdg = new StructureDiagramGenerator();
	SmilesParser sp = new SmilesParser(DefaultChemObjectBuilder.getInstance());
	AtomContainer matches = new AtomContainer();
	Vector<Integer> idlist = new Vector<Integer>();
	List generators = new ArrayList();
	Renderer renderer;
	BufferedImage image;
	Graphics2D g2;

	ByteArrayOutputStream out = new ByteArrayOutputStream();

	public Display (String smiles, int s) {

		size = s; 
		// generators make the image elements
		generators.add(new BasicSceneGenerator());
		generators.add(new BasicBondGenerator());
		generators.add(new RingGenerator());
		generators.add(new BasicAtomGenerator());
		renderer = new Renderer(generators, new AWTFontManager());
		try { molecule = sp.parseSmiles(smiles); }
		catch (Exception ex) { ex.printStackTrace(); }
		moleculeSet = ConnectivityChecker.partitionIntoMolecules(molecule);
		coordinated_mols = new IMolecule[moleculeSet.getMoleculeCount()];
		drawArea = new Rectangle(size, size);
		image = new BufferedImage(size, size , BufferedImage.TYPE_INT_RGB);
		g2 = (Graphics2D)image.getGraphics();
		g2.setColor(Color.yellow);
		g2.fillRect(0, 0, size, size);
	}

	public byte[] image() {
		try {
			Rectangle2D last = new Rectangle(0,0);
			for (int i = 0; i < moleculeSet.getMoleculeCount(); i++) {
				IAtomContainer mol = moleculeSet.getMolecule(i);
				sdg.setMolecule((IMolecule) mol);
				sdg.generateCoordinates();
				mol = sdg.getMolecule();
				GeometryTools.translateAllPositive(mol);
				
				// get size of previous mol and shift
				last = GeometryTools.shiftContainer(mol, GeometryTools.getRectangle2D(mol), last,2);
				coordinated_mols[i] = (IMolecule) mol;
			}
			moleculeSet.setMolecules(coordinated_mols);
			renderer.paintMoleculeSet(moleculeSet, new AWTDrawVisitor(g2), drawArea, true);
			//matchSmarts("NN",Color.green);
			ImageIO.write(image, "png", out);
		} catch (Exception ex) {
				ex.printStackTrace();
		}
		return out.toByteArray();
	}

//	public Image match(String smiles, String smarts) {
//	}
	private void matchSmarts(String smarts, Color color) {
		try {
			// map smarts
				SMARTSQueryTool querytool = new SMARTSQueryTool(smarts);
				boolean status = querytool.matches(molecule);
				if (status) {
					List<List<java.lang.Integer>>	mappings = querytool.getMatchingAtoms();
					int nmatch = querytool.countMatches();
					for (int i = 0; i < nmatch; i++) {
						List atomIndices = (List) mappings.get(i);
						for (int n = 0; n < atomIndices.size(); n++) {
							Integer atomID = (Integer) atomIndices.get(n);
							idlist.add(atomID);
						}
					}
				}

				// get a unique list of bond ID's and add them to an AtomContainer
				HashSet<Integer> hs = new HashSet<Integer>(idlist);
				for (Integer h : hs) {
					IAtom a = molecule.getAtom(h);
					List bond_list = molecule.getConnectedBondsList(a);
					for (int i = 0; i < bond_list.size(); i++) {
						IBond b = (IBond) bond_list.get(i);
						Integer connectedNr = molecule.getAtomNumber(b.getConnectedAtom(a));
						//if (hs.contains(connectedNr)) renderer.getRenderer2DModel().getColorHash().put(b, color);
					}
				}

		} catch (Exception exc) {
				exc.printStackTrace();
		}

	}

}