Canonical label その3

各原子に割り当てられた素数の積と
並び替えらた原子の中間順位を出力してみます。


/* inv_label_EC.java */

import java.io.*;
import org.openscience.cdk.interfaces.*;
import org.openscience.cdk.io.iterator.IteratingMDLReader;
import org.openscience.cdk.DefaultChemObjectBuilder;

import org.openscience.cdk.smiles.SmilesGenerator;
import org.openscience.cdk.tools.manipulator.AtomContainerManipulator;

import org.openscience.cdk.smiles.InvPair;
import org.openscience.cdk.tools.periodictable.PeriodicTable;
import org.openscience.cdk.CDKConstants;
import java.util.*;


class inv_label_EC {

public static void main(String args[]){

if(args.length!=1){
System.err.println("inv_label <sd-file>");
System.exit(1);
}
FileInputStream fis = null;
IteratingMDLReader isr = null;
try{
fis = new FileInputStream(new File(args[0]) );
isr = new IteratingMDLReader(fis, DefaultChemObjectBuilder.getInstance() );
} catch (Exception e) {
e.printStackTrace();
}

while( isr.hasNext() ){
IMolecule imol = (IMolecule)isr.next();
String id = (String)imol.getProperty("cdk:Title");

ArrayList vect = new ArrayList();
try {
AtomContainerManipulator acm = new AtomContainerManipulator();
IAtomContainer atoms = acm.removeHydrogens(imol);
vect = createInvarLabel(atoms);

System.out.printf("%s", id);
for (int i = 0 ; i < vect.size() ; i++){
System.out.printf(" %s", atoms.getAtom(i).getSymbol() );
}
System.out.print("\n");
for (int i = 0 ; i < vect.size() ; i++){
System.out.printf(" %s",
atoms.getAtom(i).getProperty("InvariancePair"));
}
System.out.print("\n");

step3(vect, atoms);

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

private static void primeProduct(ArrayList v, IAtomContainer atomContainer) {
Iterator it = v.iterator();
Iterator n;
InvPair inv;
IAtom a;
long summ;
while (it.hasNext()) {
inv = (InvPair) it.next();
List neighbour = atomContainer.getConnectedAtomsList(inv.getAtom());
n = neighbour.iterator();
summ = 1;
while (n.hasNext()) {
a = (IAtom) n.next();
int next = ( (InvPair)a.getProperty(InvPair.INVARIANCE_PAIR)).getPrime();
summ = summ * next;
}
inv.setLast(inv.getCurr());
inv.setCurr(summ);
}
}

private static void sortArrayList(ArrayList v) {
Collections.sort(v, new Comparator() {
public int compare(Object o1, Object o2) {
return (int) ( ( (InvPair) o1).getCurr() - ( (InvPair)o2).getCurr());
}
});
Collections.sort(v, new Comparator() {
public int compare(Object o1, Object o2) {
return (int) ( ( (InvPair) o1).getLast() - ( (InvPair)o2).getLast());
}
});
}

private static void rankArrayList(ArrayList v) {
int num = 1;
int[] temp = new int[v.size()];
InvPair last = (InvPair) v.get(0);
Iterator it = v.iterator();
InvPair curr;
for (int x = 0; it.hasNext(); x++) {
curr = (InvPair) it.next();
if (!last.equals(curr)) {
num++;
}
temp[x] = num;
last = curr;
}
it = v.iterator();
for (int x = 0; it.hasNext(); x++) {
curr = (InvPair) it.next();
curr.setCurr(temp[x]);
curr.setPrime();
}
}

private static boolean isInvPart(ArrayList v) {
if ( ( (InvPair) v.get(v.size()-1)).getCurr() == v.size())
return true;
Iterator it = v.iterator();
InvPair curr;
while (it.hasNext()) {
curr = (InvPair) it.next();
if (curr.getCurr() != curr.getLast())
return false;
}
return true;
}

private static void breakTies(ArrayList v) {
Iterator it = v.iterator();
InvPair curr;
InvPair last = null;
int tie = 0;
boolean found = false;
for (int x = 0; it.hasNext(); x++) {
curr = (InvPair) it.next();
curr.setCurr(curr.getCurr() * 2);
curr.setPrime();
if (x != 0 && !found && curr.getCurr() == last.getCurr()) {
tie = x - 1;
found = true;
}
last = curr;
}
curr = (InvPair) v.get(tie);
curr.setCurr(curr.getCurr() - 1);
curr.setPrime();
}

private static ArrayList createInvarLabel(IAtomContainer ac) {
StringBuffer inv;
ArrayList vect = new ArrayList();
for (int i = 0 ; i < ac.getAtomCount(); i++){
IAtom a = ac.getAtom(i);
inv = new StringBuffer();
Integer ddd = a.getImplicitHydrogenCount();

// 1. Num connections (incl H)
inv.append( ac.getConnectedAtomsList(a).size() +
(a.getImplicitHydrogenCount() == CDKConstants.UNSET ?
0 : a.getImplicitHydrogenCount()) );
// 2. Num of non H bonds
//System.out.printf(" %d\n", ac.getConnectedAtomsList(a).size() );
inv.append( String.format("%02d",
ac.getConnectedAtomsList(a).size()) );
// 3. Atomic num
inv.append( String.format("%02d",
PeriodicTable.getAtomicNumber(a.getSymbol()) ) );
// 4. Sign of charge
Integer fcharge = a.getFormalCharge();
if (fcharge == CDKConstants.UNSET) fcharge = 0;
if (fcharge < 0){
inv.append(1);
} else {
inv.append(0);
}
// 5. Absolute charge
inv.append( (int)Math.abs( (a.getFormalCharge() ==
CDKConstants.UNSET ? 0.0 : a.getFormalCharge()) ) );
// 6. Hydrogen count
inv.append( (a.getImplicitHydrogenCount() == CDKConstants.UNSET ?
0 : a.getImplicitHydrogenCount()));

vect.add(new InvPair(Long.parseLong(inv.toString()), a));
}
return vect;
}
}