/** * Get all paths of lengths 0 to the specified length. * * <p>This method will find all paths upto length N starting from each atom in the molecule and * return the unique set of such paths. * * @param container The molecule to search * @return A map of path strings, keyed on themselves */ private Integer[] findPaths(IAtomContainer container) { ShortestPathWalker walker = new ShortestPathWalker(container); // convert paths to hashes List<Integer> paths = new ArrayList<Integer>(); int patternIndex = 0; for (String s : walker.paths()) { int toHashCode = s.hashCode(); paths.add(patternIndex, toHashCode); patternIndex++; } /* * Add ring information */ IRingSet sssr = Cycles.essential(container).toRingSet(); RingSetManipulator.sort(sssr); for (Iterator<IAtomContainer> it = sssr.atomContainers().iterator(); it.hasNext(); ) { IAtomContainer ring = it.next(); int toHashCode = String.valueOf(ring.getAtomCount()).hashCode(); paths.add(patternIndex, toHashCode); patternIndex++; } /* * Check for the charges */ List<String> l = new ArrayList<String>(); for (Iterator<IAtom> it = container.atoms().iterator(); it.hasNext(); ) { IAtom atom = it.next(); int charge = atom.getFormalCharge() == null ? 0 : atom.getFormalCharge(); if (charge != 0) { l.add(atom.getSymbol().concat(String.valueOf(charge))); } } Collections.sort(l); int toHashCode = l.hashCode(); paths.add(patternIndex, toHashCode); patternIndex++; l = new ArrayList<String>(); /* * atom stereo parity */ for (Iterator<IAtom> it = container.atoms().iterator(); it.hasNext(); ) { IAtom atom = it.next(); int st = atom.getStereoParity() == null ? 0 : atom.getStereoParity(); if (st != 0) { l.add(atom.getSymbol().concat(String.valueOf(st))); } } Collections.sort(l); toHashCode = l.hashCode(); paths.add(patternIndex, toHashCode); patternIndex++; if (container.getSingleElectronCount() > 0) { StringBuilder radicalInformation = new StringBuilder(); radicalInformation.append("RAD: ").append(String.valueOf(container.getSingleElectronCount())); paths.add(patternIndex, radicalInformation.toString().hashCode()); patternIndex++; } if (container.getLonePairCount() > 0) { StringBuilder lpInformation = new StringBuilder(); lpInformation.append("LP: ").append(String.valueOf(container.getLonePairCount())); paths.add(patternIndex, lpInformation.toString().hashCode()); patternIndex++; } return paths.toArray(new Integer[paths.size()]); }